commit e97978d0b7b694872441c59f665ab92d8e30ad7f Author: [yxf] <[1524240689@qq.com]> Date: Fri Mar 27 21:37:39 2026 +0800 Initial commit: cool-admin-vue project diff --git a/.cursor/rules/adv-search.mdc b/.cursor/rules/adv-search.mdc new file mode 100644 index 0000000..153f4d8 --- /dev/null +++ b/.cursor/rules/adv-search.mdc @@ -0,0 +1,305 @@ +--- +description: cl-adv-search 组件示例 +globs: *.tsx, *.ts, *.vue +--- +## 起步 示例 + +```vue + + + + +``` + +## 自定义 示例 + +```vue + + + + +``` \ No newline at end of file diff --git a/.cursor/rules/crud.mdc b/.cursor/rules/crud.mdc new file mode 100644 index 0000000..c1af823 --- /dev/null +++ b/.cursor/rules/crud.mdc @@ -0,0 +1,1480 @@ +--- +description: cl-crud 组件示例 +globs: *.tsx, *.ts, *.vue +--- +## 完整示例 示例 + +```vue + + + + +``` + +## 起步 示例 + +```vue + + + + +``` + +## 修改文案 / 接口 示例 + +```vue + + + + +``` + +## 事件监听 示例 + +```vue + + + + +``` + +## 选择表格 示例 + +```vue + + + + +``` + +## Service 配置 示例 + +```vue + + + + +``` + +## 选择成员 示例 + +```vue + + + + +``` \ No newline at end of file diff --git a/.cursor/rules/form.mdc b/.cursor/rules/form.mdc new file mode 100644 index 0000000..60ec859 --- /dev/null +++ b/.cursor/rules/form.mdc @@ -0,0 +1,1820 @@ +--- +description: cl-form 组件示例 +globs: *.tsx, *.ts, *.vue +--- +## 层级显示 示例 + +```vue + + + + +``` + +## 组件渲染 示例 + +```vue + + + + +``` + +## select-labels 示例 + +```vue + + + + + +``` + +## select-status 示例 + +```vue + + + + + +``` + +## select-work 示例 + +```vue + + + + + +``` + +## select-work2 示例 + +```vue + + + + + +``` + +## 参数配置 示例 + +```vue + + + + +``` + +## 内嵌CRUD 示例 + +```vue + + + + +``` + +## 组件禁用 示例 + +```vue + + + + +``` + +## 组件事件 示例 + +```vue + + + + +``` + +## 分组显示 示例 + +```vue + + + + +``` + +## 隐藏/显示 示例 + +```vue + + + + +``` + +## 布局 示例 + +```vue + + + + +``` + +## 起步 示例 + +```vue + + + + +``` + +## 选项框配置 示例 + +```vue + + + + +``` + +## 插件的使用 示例 + +```vue + + + + +``` + +## 必填项配置 示例 + +```vue + + + + +``` + +## 添加/删除表单项 示例 + +```vue + + + + + + +``` \ No newline at end of file diff --git a/.cursor/rules/module.mdc b/.cursor/rules/module.mdc new file mode 100644 index 0000000..daa2139 --- /dev/null +++ b/.cursor/rules/module.mdc @@ -0,0 +1,464 @@ +--- +description: module | plugins 模块、插件 +globs: +--- +# 模块/插件开发 + +## 目录结构 + +在 `src/modules` 或 `src/plugins` 下添加一个目录 `demo`: + +```js +demo + ├──pages // 页面路由 + ├──views // 视图路由 + ├──hooks // 常用函数 + ├──components // 常用组件 + ├──directives // 指令 + ├──static // 静态文件目录 + ├──store // 状态管理 + ├──... // 其他自定义文件 + ├──config.ts // 配置文件 + └──index.ts // 入口文件 +``` + +::: warning +约定的目录名称不可修改,但可自行添加或者删除。 +::: + +## pages、views + +1. 页面参与权限控制,所以不主动注册目录下的路由,通过 `菜单列表` 中配置注册。或者在 `config.ts` 中手动配置: + +```js +import { type ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + views: [ + { + path: "/demo", + meta: { + label: "测试", + }, + component: () => import("./views/demo.vue"), + }, + ], + pages: [ + { + path: "/demo2", + meta: { + label: "测试", + }, + component: () => import("./pages/demo.vue"), + }, + ], + }; +}; +``` + +2. 使页面参与路由缓存,配置 `name` 参数 + +:::warning + +`path` 与 `name` 的匹配规则: + +- /demo/t1 = demo-t1 +- /demo/t1-det = demo-t1-det + +::: + +方式 1: + +```html + +``` + +方式 2: + +```html + +``` + +## components + +目录下的组件,全局注册配置方法如下: + +```js +import { ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + components: [ + import("./components/demo.vue"), + import("./components/demo1.vue"), + ], + }; +}; +``` + +## directives + +`directives` 会以目录下的文件名分别注册指令 + +```ts +// demo/directives/test.ts +export default { + created(el, binding) {}, + mounted() {}, + ... +}; +``` + +使用 + +```html +
+``` + +## store + +使用 `pinia` 的推荐写法: + +```ts +import { defineStore } from "pinia"; +import { ref } from "vue"; + +export const useTestStore = defineStore("test", function () { + const count = ref(0); + + function add() { + count.value += 1; + } + + return { + count, + add, + }; +}); +``` + +使用 + +```ts +import { useTestStore } from "/$/demo/store"; + +const test = useTestStore(); + +test.add(); + +console.log(test.count); // 1 +``` + +::: tip +参考 `base` 模块下 `store` 的导出方式 +::: + +## config.ts + +模块的配置,程序运行时会读取该文件。 + +- 全局组件、路由的导入 + +- 事件钩子 + +输入 `module-config` 关键字,`vscode` 中会自动生成: + +```ts +import { ModuleConfig } from "/@/cool"; +import { Vue } from "vue"; + +export default (): ModuleConfig => { + return { + // 是否启用 + enable: true, + + // 插件名称 + label: "插件名称", + + // 插件描述 + description: "插件描述", + + // 作者 + author: "作者", + version: "1.0.0", + updateTime: "2024-02-02", + logo: "", + + // 忽略 + ignore: { + // 忽略进度条的请求 + NProgress: [ + "/base/open/eps", + "/base/comm/person", + "/base/comm/permmenu", + "/base/comm/upload", + "/base/comm/uploadMode", + ], + + // 忽略 token 的路由 + token: ["/login", "/401", "/403", "/404", "/500", "/502"], + }, + + // 排序 + order: 0, + + // 配置参数 + options: { + name: "神仙", + }, + + // 示例页面 + demo: [ + { + name: "基础用法", + component: () => import("..."), + }, + ], + + // 注册全局组件 + components: [], + + // 视图路由 + views: [], + + // 页面路由 + pages: [], + + // 顶部工具栏 + toolbar: { + order: 1, + pc: true, // 是否在 pc 端显示 + h5: true, // 是否在 h5 端显示 + component: import("./components/index.vue"), + }, + + // 注入全局组件 + index: { + component: import("./components/index.vue"), + }, + + // 安装时触发 + install(app: Vue) {}, + + // 加载时触发 + onLoad(events) {}, + }; +}; +``` + +- order 模块加载顺序,值越大越先 + +- options 提供给外部使用的参数配置: + +```ts +import { ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + options: { + // 尺寸 + size: 120, + // 显示文案 + text: "选择文件", + // 限制 + limit: { + // 上传最大数量 + upload: 9, + // 文件空间选择数 + select: 9, + // 上传大小限制 + size: 100, + }, + }, + }; +}; +``` + +获取方式: + +```ts +import { module } from "/@/cool"; + +const config = module.config("模块名"); +``` + +- components 提供全局的组件: + +```ts +import type { ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + components: [import("./components/test.vue")], + }; +}; +``` + +批量导入可以使用 [import.meta.glob](mdc:https:/vitejs.dev/guide/features.html#glob-import) 方法: + +```ts +import { ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + components: Object.values(import.meta.glob("./components/**/*")), + }; +}; +``` + +- views 全局注册的视图路由,存放在 `/` 中的子路由 `children`: + +```ts +import { ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + views: [ + { + path: "/test", + meta: { + label: "测试中心", + }, + component: () => import("./views/test.vue"), + }, + ], + }; +}; +``` + +- pages 全局注册的页面路由: + +```ts +import { ModuleConfig } from "/@/cool"; + +export default (): ModuleConfig => { + return { + pages: [ + { + path: "/test", + meta: { + label: "测试中心", + }, + component: () => import("./views/test.vue"), + }, + ], + }; +}; +``` + +- install 模块安装时触发。用于预先处理: + +```ts +import { ModuleConfig } from "/@/cool"; +import { Vue } from "vue"; + +export default (): ModuleConfig => { + return { + install(app: Vue) { + // 注册组件 + app.component("test", Test); + + // 注册指令 + app.directive("focus", { + created(el, bind) {}, + }); + }, + }; +}; +``` + +- onLoad 模块安装时触发,预先加载数据,如菜单配置、用户信息: + + 1. 使用 `await` 等待加载完成后往下执行 + + 2. 可往下模块导出某个方法和变量,如 `hasToken` 验证是否有登陆 + +```ts +import { ModuleConfig } from "/@/cool"; +import { Vue } from "vue"; + +export default (): ModuleConfig => { + return { + async onLoad() { + const { user, menu } = useStore(); + + if (user.token) { + // 获取用户信息 + user.get(); + // 获取菜单权限 + await menu.get(); + } + + return { + async hasToken(cb: () => Promise | void) { + if (user.token) { + if (cb) await cb(); + } + }, + }; + }, + }; +}; +``` + +其他模块中接收 `hasToken` 方法: + +```ts +import { ModuleConfig } from "/@/cool"; +import { useDict } from "./index"; + +export default (): ModuleConfig => { + return { + onLoad({ hasToken }) { + const { dict } = useDict(); + + hasToken(() => { + dict.refresh(); + }); + }, + }; +}; +``` + +## index.ts + +该模块需要对外开放的变量及方法,方便于别人直接使用: + +```ts +// modules/test/index.ts +import { useStore } from "./store"; + +export function useTest() { + return { + // 导出 pinia + ...useStore(), + + // 自定义方法 + test() {}, + + // 自定义变量 + data: { + description: "数据描述", + }, + }; +} +``` + +导出命名规则 `useBase` `useDemo` `useDict` use + 模块名 + +使用: + +```ts +import { useTest } from "/$/test"; + +const { data, test } = useTest(); +``` diff --git a/.cursor/rules/search.mdc b/.cursor/rules/search.mdc new file mode 100644 index 0000000..5f6f16f --- /dev/null +++ b/.cursor/rules/search.mdc @@ -0,0 +1,743 @@ +--- +description: cl-search 组件示例 +globs: *.tsx, *.ts, *.vue +--- +## 起步 示例 + +```vue + + + + +``` + +## 折叠 示例 + +```vue + + + +x + +``` + +## 自定义 示例 + +```vue + + + + +``` + +## 布局 示例 + +```vue + + + + +``` + +## 使用插件 示例 + +```vue + + + + +``` \ No newline at end of file diff --git a/.cursor/rules/table.mdc b/.cursor/rules/table.mdc new file mode 100644 index 0000000..2443933 --- /dev/null +++ b/.cursor/rules/table.mdc @@ -0,0 +1,2117 @@ +--- +description: cl-table 组件示例 +globs: *.tsx, *.ts, *.vue +--- +## 起步 示例 + +```vue + + + + +``` + +## 多级表头 示例 + +```vue + + + + +``` + +## 自定义列展示 示例 + +```vue + + + + +``` + +## 组件渲染 示例 + +```vue + + + + +``` + +## user-info 示例 + +```vue + + + + + + + +``` + +## 右键菜单 示例 + +```vue + + + + +``` + +## 字典匹配 示例 + +```vue + + + + +``` + +## 数据格式化 示例 + +```vue + + + + +``` + +## 隐藏/显示 示例 + +```vue + + + + +``` + +## 操作栏 示例 + +```vue + + + + +``` + +## 插件的使用 示例 + +```vue + + + + +``` + +## 行编辑 示例 + +```vue + + + + +``` + +## 表头搜索 示例 + +```vue + + + + +``` + +## 多选框数据 示例 + +```vue + + + + +``` + +## 插槽的使用 示例 + +```vue + + + + +``` + +## 合并行或列 示例 + +```vue + + + + +``` + +## 表尾合计行 示例 + +```vue + + + + +``` \ No newline at end of file diff --git a/.cursor/rules/upsert.mdc b/.cursor/rules/upsert.mdc new file mode 100644 index 0000000..1b34574 --- /dev/null +++ b/.cursor/rules/upsert.mdc @@ -0,0 +1,716 @@ +--- +description: cl-upsert 组件示例 +globs: *.tsx, *.ts, *.vue +--- +## 起步 示例 + +```vue + + + + +``` + +## 打开、关闭、提交等事件 示例 + +```vue + + + + +``` + +## Hook的使用 示例 + +```vue + + + + +``` + +## 新增、编辑、详情模式 示例 + +```vue + + + + +``` \ No newline at end of file diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..c0df244 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,74 @@ +# 项目背景 + +- 库:typescript、javaScript、scss、vue、tailwind +- 框架:cool-admin-vue +- 项目版本:8.x + +# 项目目录 + +├── .vscode(代码片段,根据关键字可以快速地生成代码) +├── public(静态资源文件) +├── packages(源码包:@cool-vue/crud、@cool-vue/vite-plugin) +├── build +│ └── cool() +│ │ └── eps.json(Eps 配置文件) +│ │ └── eps.d.ts(Eps 描述文件) +├── src +│ └── cool(核心文件) +│ └── modules(项目模块) +│ │ └── base(基础模块) +│ │ └── demo(示例模块) +│ │ └── dict(字典模块) +│ │ └── helper(辅助模块) +│ │ └── recycle(回收站模块) +│ │ └── space(cl-upload-space 文件空间模块) +│ │ └── task(任务模块) +│ │ └── user(用户模块) +│ └── plugins(项目插件) +│ │ └── crud(cl-crud、@cool-vue/crud) +│ │ └── distpicker(cl-distpicker、省市区选择器) +│ │ └── echarts(图标) +│ │ └── editor-preview(编辑器预览组件) +│ │ └── editor-wange(wang富文本编辑器) +│ │ └── element-ui(element-plus 组件) +│ │ └── excel(excel导入、导出组件) +│ │ └── i18n(多语言) +│ │ └── iconfont(iconfont 图标) +│ │ └── theme(cl-theme 主题组件) +│ │ └── upload(cl-upload 文件上传组件) +│ │ └── view(cl-view-group、cl-view-head 视图组件) +│ └── config +│ │ └── index.ts(默认配置) +│ │ └── dev.ts(开发环境) +│ │ └── prod.ts(生产环境) +│ │ └── proxy.ts(代理配置) +│ └── App.vue(入口文件) +│ └── main.ts(入口文件) +├── package.json(依赖管理,项目信息) +└── ... + +模块、插件目录 +├── modules/plugins +│ └── base(模块名) +│ │ └── components(全局组件) +│ │ └── directives(全局指令) +│ │ └── locales(国际化) +│ │ └── router(路由) +│ │ └── store(状态管理) +│ │ └── utils(工具函数) +│ │ └── views(视图) +│ │ └── config.ts(必须,模块的配置) +│ │ └── index.ts(模块导出) + +# 其它 + +- 文件、组件命名用 - 连接,如:student-info.vue +- service 的描述类型,查看 build/cool/eps.d.ts 描述文件 +- 创建模块、插件代码需要读取.cursor/rules的module.mdc,其它的rules根据需要进行参考 + +# import 引用别名 + +- "/@" 对应 "./src" +- "/$" 对应 "./src/modules" +- "/#" 对应 "./src/plugins" +- "/~" 对应 "./packages" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d451ff1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..284364f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] +charset = utf-8 +end_of_line = lf +indent_style = tab +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.env b/.env new file mode 100644 index 0000000..028356d --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +# 应用名称 +VITE_NAME = "COOL-ADMIN" + +# 网络超时请求时间 +VITE_TIMEOUT = 30000 \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e41187f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.js text eol=lf +*.json text eol=lf +*.ts text eol=lf +*.vue text eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..615a016 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +.DS_Store +node_modules/ +/dist/ +dist-ssr/ + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.project +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* + +vite.config.ts.timestamp* diff --git a/.hintrc b/.hintrc new file mode 100644 index 0000000..de024c3 --- /dev/null +++ b/.hintrc @@ -0,0 +1,16 @@ +{ + "extends": [ + "development" + ], + "hints": { + "meta-viewport": "off", + "axe/text-alternatives": [ + "default", + { + "document-title": "off" + } + ], + "disown-opener": "off", + "css-prefix-order": "off" + } +} \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..29d7d66 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": true, + "useTabs": true, + "tabWidth": 4, + "printWidth": 100, + "singleQuote": true, + "arrowParens": "avoid", + "trailingComma": "none" +} diff --git a/.vscode/config.code-snippets b/.vscode/config.code-snippets new file mode 100644 index 0000000..6fd0453 --- /dev/null +++ b/.vscode/config.code-snippets @@ -0,0 +1,15 @@ +{ + "module-config": { + "prefix": "module-config", + "scope": "typescript", + "body": [ + "import { type ModuleConfig } from \"/@/cool\";", + "", + "export default (): ModuleConfig => {", + " return {};", + "};", + "" + ], + "description": "module config snippets" + } +} diff --git a/.vscode/crud.code-snippets b/.vscode/crud.code-snippets new file mode 100644 index 0000000..0c4694b --- /dev/null +++ b/.vscode/crud.code-snippets @@ -0,0 +1,100 @@ +{ + "cl-crud": { + "prefix": "cl-crud", + "scope": "vue", + "body": [ + "", + "", + "", + "" + ], + "description": "cl-crud snippets" + }, + "cl-filter": { + "prefix": "cl-filter", + "scope": "html", + "body": [ + "", + " ", + "" + ], + "description": "cl-filter snippets" + }, + "slot-item": { + "prefix": "slot item", + "scope": "html", + "body": ["", ""], + "description": "slot snippets" + }, + "slot-column": { + "prefix": "slot column", + "scope": "html", + "body": ["", ""], + "description": "column slot snippets" + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..7355b16 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3e56ecf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "editor.cursorSmoothCaretAnimation": "on", + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.patterns": { + "tsconfig.json": "tsconfig.*.json, env.d.ts", + "vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*", + "package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig" + }, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit" + }, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..811db32 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM node:lts-alpine +WORKDIR /build +# 设置npm镜像 +RUN npm config set registry https://registry.npmmirror.com +COPY package.json /build/package.json +RUN npm install +COPY ./ /build +RUN npm run build + +FROM nginx +RUN mkdir /app +COPY --from=0 /build/dist /app +COPY --from=0 /build/nginx.conf /etc/nginx/nginx.conf +EXPOSE 80 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b6722d4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,33 @@ +MIT License + +Copyright (c) [2025] [厦门闪酷科技开发有限公司] + +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 without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +MIT 许可证 + +版权所有 (c) [2025] [厦门闪酷科技开发有限公司] + +特此免费授予获得本软件及相关文档文件(“软件”)副本的任何人无限制地处理本软件的权限,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许软件提供给其的人员这样做,但须符合以下条件: + +上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。 + +本软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于对适销性、特定用途适用性和非侵权的担保。在任何情况下,作者或版权持有人均不对因软件或软件使用或其他交易而产生的任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中。 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7a03692 --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# cool-admin [vue3 - ts - vite] + +

+ cool-admin Logo +

+ +

cool-admin 一个很酷的后台权限管理系统,开源免费,模块化、插件化、极速开发 CRUD,方便快速构建迭代后台管理系统, 到文档 进一步了解

+ +

+ GitHub license + GitHub tag + GitHub tag +

+ +## 特性 + +Ai时代,很多老旧的框架已经无法满足现代化的开发需求,Cool-Admin开发了一系列的功能,让开发变得更简单、更快速、更高效。 + +- **Ai编码**:通过微调大模型学习框架特有写法,实现简单功能从Api接口到前端页面的一键生成 +- **流程编排**:通过拖拽编排方式,即可实现类似像智能客服这样的功能 +- **模块化**:代码是模块化的,清晰明了,方便维护 +- **插件化**:插件化的设计,可以通过安装插件的方式扩展如:支付、短信、邮件等功能 + +![](https://cool-show.oss-cn-shanghai.aliyuncs.com/admin/flow.png) + +## 地址 + +- [📌 v7 版本](https://github.com/cool-team-official/cool-admin-vue/tree/7.x) + +- [🌐 码云仓库](https://gitee.com/cool-team-official/cool-admin-vue) + +## 视频教程 + +[官方 B 站视频教程](https://www.bilibili.com/video/BV1j1421R7aB) + +## 演示 + +[https://show.cool-admin.com](https://show.cool-admin.com) + +账户:admin,密码:123456 + +Admin Home + +## 项目后端 + +[https://github.com/cool-team-official/cool-admin-midway](https://github.com/cool-team-official/cool-admin-midway) + +或 + +[https://gitee.com/cool-team-official/cool-admin-midway](https://gitee.com/cool-team-official/cool-admin-midway) + +或 + +[https://gitcode.com/cool_team/cool-admin-midway](https://gitcode.com/cool_team/cool-admin-midway) + +## 微信群 + +Admin Wechat + +## 安装项目依赖 + +推荐使用 `pnpm`: + +```shell +pnpm i +``` + +## 运行应用程序 + +安装过程完成后,运行以下命令启动服务。您可以在浏览器中预览网站 [http://localhost:9000](http://localhost:9000) + +```shell +pnpm dev +``` + +### 低价服务器 + +[阿里云、腾讯云、华为云低价云服务器,不限新老](https://cool-js.com/service/cloud) diff --git a/build/cool/eps.d.ts b/build/cool/eps.d.ts new file mode 100644 index 0000000..fd274fc --- /dev/null +++ b/build/cool/eps.d.ts @@ -0,0 +1,1588 @@ +declare namespace Eps { + interface BaseSysDepartmentEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface BaseSysLogEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface BaseSysMenuEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface BaseSysParamEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface BaseSysRoleEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface BaseSysUserEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface CsChatEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface CsMsgEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface CsSessionEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface DemoGoodsEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface DictInfoEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface DictTypeEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface PluginInfoEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface RecycleDataEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface SpaceInfoEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface SpaceTypeEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface StaffInfoEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface TaskInfoEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface UserAddressEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + interface UserInfoEntity { + /** + * 任意键值 + */ + [key: string]: any; + } + + type json = any; + + interface PagePagination { + size: number; + page: number; + total: number; + [key: string]: any; + } + + interface PageResponse { + pagination: PagePagination; + list: T[]; + [key: string]: any; + } + + interface BaseSysLogPageResponse { + pagination: PagePagination; + list: BaseSysLogEntity[]; + } + + interface BaseSysMenuPageResponse { + pagination: PagePagination; + list: BaseSysMenuEntity[]; + } + + interface BaseSysParamPageResponse { + pagination: PagePagination; + list: BaseSysParamEntity[]; + } + + interface BaseSysRolePageResponse { + pagination: PagePagination; + list: BaseSysRoleEntity[]; + } + + interface BaseSysUserPageResponse { + pagination: PagePagination; + list: BaseSysUserEntity[]; + } + + interface CsChatPageResponse { + pagination: PagePagination; + list: CsChatEntity[]; + } + + interface CsMsgPageResponse { + pagination: PagePagination; + list: CsMsgEntity[]; + } + + interface CsSessionPageResponse { + pagination: PagePagination; + list: CsSessionEntity[]; + } + + interface DemoGoodsPageResponse { + pagination: PagePagination; + list: DemoGoodsEntity[]; + } + + interface DictInfoPageResponse { + pagination: PagePagination; + list: DictInfoEntity[]; + } + + interface DictTypePageResponse { + pagination: PagePagination; + list: DictTypeEntity[]; + } + + interface PluginInfoPageResponse { + pagination: PagePagination; + list: PluginInfoEntity[]; + } + + interface RecycleDataPageResponse { + pagination: PagePagination; + list: RecycleDataEntity[]; + } + + interface SpaceInfoPageResponse { + pagination: PagePagination; + list: SpaceInfoEntity[]; + } + + interface SpaceTypePageResponse { + pagination: PagePagination; + list: SpaceTypeEntity[]; + } + + interface StaffInfoPageResponse { + pagination: PagePagination; + list: StaffInfoEntity[]; + } + + interface TaskInfoPageResponse { + pagination: PagePagination; + list: TaskInfoEntity[]; + } + + interface UserAddressPageResponse { + pagination: PagePagination; + list: UserAddressEntity[]; + } + + interface UserInfoPageResponse { + pagination: PagePagination; + list: UserInfoEntity[]; + } + + interface BaseCoding { + /** + * getModuleTree + */ + getModuleTree(data?: any): Promise; + + /** + * createCode + */ + createCode(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { getModuleTree: string; createCode: string }; + + /** + * 权限状态 + */ + _permission: { getModuleTree: boolean; createCode: boolean }; + + request: Request; + } + + interface BaseComm { + /** + * personUpdate + */ + personUpdate(data?: any): Promise; + + /** + * uploadMode + */ + uploadMode(data?: any): Promise; + + /** + * permmenu + */ + permmenu(data?: any): Promise; + + /** + * program + */ + program(data?: any): Promise; + + /** + * person + */ + person(data?: any): Promise; + + /** + * upload + */ + upload(data?: any): Promise; + + /** + * logout + */ + logout(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + personUpdate: string; + uploadMode: string; + permmenu: string; + program: string; + person: string; + upload: string; + logout: string; + }; + + /** + * 权限状态 + */ + _permission: { + personUpdate: boolean; + uploadMode: boolean; + permmenu: boolean; + program: boolean; + person: boolean; + upload: boolean; + logout: boolean; + }; + + request: Request; + } + + interface BaseOpen { + /** + * refreshToken + */ + refreshToken(data?: any): Promise; + + /** + * captcha + */ + captcha(data?: any): Promise; + + /** + * login + */ + login(data?: any): Promise; + + /** + * html + */ + html(data?: any): Promise; + + /** + * eps + */ + eps(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + refreshToken: string; + captcha: string; + login: string; + html: string; + eps: string; + }; + + /** + * 权限状态 + */ + _permission: { + refreshToken: boolean; + captcha: boolean; + login: boolean; + html: boolean; + eps: boolean; + }; + + request: Request; + } + + interface BaseSysDepartment { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * order + */ + order(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { delete: string; update: string; order: string; list: string; add: string }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + order: boolean; + list: boolean; + add: boolean; + }; + + request: Request; + } + + interface BaseSysLog { + /** + * setKeep + */ + setKeep(data?: any): Promise; + + /** + * getKeep + */ + getKeep(data?: any): Promise; + + /** + * clear + */ + clear(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { setKeep: string; getKeep: string; clear: string; page: string }; + + /** + * 权限状态 + */ + _permission: { setKeep: boolean; getKeep: boolean; clear: boolean; page: boolean }; + + request: Request; + } + + interface BaseSysMenu { + /** + * create + */ + create(data?: any): Promise; + + /** + * export + */ + export(data?: any): Promise; + + /** + * import + */ + import(data?: any): Promise; + + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * parse + */ + parse(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + create: string; + export: string; + import: string; + delete: string; + update: string; + parse: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + create: boolean; + export: boolean; + import: boolean; + delete: boolean; + update: boolean; + parse: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface BaseSysParam { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * html + */ + html(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + html: string; + info: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + html: boolean; + info: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface BaseSysRole { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface BaseSysUser { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * move + */ + move(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + move: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + move: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface CsChat { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface CsMsg { + /** + * unreadCount + */ + unreadCount(data?: any): Promise; + + /** + * read + */ + read(data?: any): Promise; + + /** + * send + */ + send(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { unreadCount: string; read: string; send: string; page: string }; + + /** + * 权限状态 + */ + _permission: { unreadCount: boolean; read: boolean; send: boolean; page: boolean }; + + request: Request; + } + + interface CsSession { + /** + * page + */ + page(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { page: string }; + + /** + * 权限状态 + */ + _permission: { page: boolean }; + + request: Request; + } + + interface DemoGoods { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface DemoTenant { + /** + * noTenant + */ + noTenant(data?: any): Promise; + + /** + * noUse + */ + noUse(data?: any): Promise; + + /** + * use + */ + use(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { noTenant: string; noUse: string; use: string }; + + /** + * 权限状态 + */ + _permission: { noTenant: boolean; noUse: boolean; use: boolean }; + + request: Request; + } + + interface DictInfo { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * types + */ + types(data?: any): Promise; + + /** + * data + */ + data(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + types: string; + data: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + types: boolean; + data: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface DictType { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface PluginInfo { + /** + * install + */ + install(data?: any): Promise; + + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + install: string; + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + install: boolean; + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface RecycleData { + /** + * restore + */ + restore(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { restore: string; info: string; page: string }; + + /** + * 权限状态 + */ + _permission: { restore: boolean; info: boolean; page: boolean }; + + request: Request; + } + + interface SpaceInfo { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface SpaceType { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface StaffInfo { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface StaffLogin { + /** + * login + */ + login(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { login: string }; + + /** + * 权限状态 + */ + _permission: { login: boolean }; + + request: Request; + } + + interface TaskInfo { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * start + */ + start(data?: any): Promise; + + /** + * once + */ + once(data?: any): Promise; + + /** + * stop + */ + stop(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * log + */ + log(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + start: string; + once: string; + stop: string; + info: string; + page: string; + log: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + start: boolean; + once: boolean; + stop: boolean; + info: boolean; + page: boolean; + log: boolean; + add: boolean; + }; + + request: Request; + } + + interface UserAddress { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface UserInfo { + /** + * delete + */ + delete(data?: any): Promise; + + /** + * update + */ + update(data?: any): Promise; + + /** + * info + */ + info(data?: any): Promise; + + /** + * list + */ + list(data?: any): Promise; + + /** + * page + */ + page(data?: any): Promise; + + /** + * add + */ + add(data?: any): Promise; + + /** + * 权限标识 + */ + permission: { + delete: string; + update: string; + info: string; + list: string; + page: string; + add: string; + }; + + /** + * 权限状态 + */ + _permission: { + delete: boolean; + update: boolean; + info: boolean; + list: boolean; + page: boolean; + add: boolean; + }; + + request: Request; + } + + interface RequestOptions { + url: string; + method?: "OPTIONS" | "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "TRACE" | "CONNECT"; + data?: any; + params?: any; + headers?: any; + timeout?: number; + [key: string]: any; + } + + type Request = (options: RequestOptions) => Promise; + + type DictKey = "brand" | "occupation"; + + type Service = { + request: Request; + + base: { + coding: BaseCoding; + comm: BaseComm; + open: BaseOpen; + sys: { + department: BaseSysDepartment; + log: BaseSysLog; + menu: BaseSysMenu; + param: BaseSysParam; + role: BaseSysRole; + user: BaseSysUser; + }; + }; + cs: { chat: CsChat; msg: CsMsg; session: CsSession }; + demo: { goods: DemoGoods; tenant: DemoTenant }; + dict: { info: DictInfo; type: DictType }; + plugin: { info: PluginInfo }; + recycle: { data: RecycleData }; + space: { info: SpaceInfo; type: SpaceType }; + staff: { info: StaffInfo; login: StaffLogin }; + task: { info: TaskInfo }; + user: { address: UserAddress; info: UserInfo }; + }; +} diff --git a/build/cool/eps.json b/build/cool/eps.json new file mode 100644 index 0000000..6ca2892 --- /dev/null +++ b/build/cool/eps.json @@ -0,0 +1 @@ +[{"prefix":"/admin/base/coding","name":"","api":[{"method":"get","path":"/getModuleTree"},{"method":"post","path":"/createCode"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/comm","name":"","api":[{"method":"post","path":"/personUpdate"},{"method":"get","path":"/uploadMode"},{"method":"get","path":"/permmenu"},{"method":"get","path":"/program"},{"method":"get","path":"/person"},{"method":"post","path":"/upload"},{"method":"post","path":"/logout"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/open","name":"","api":[{"method":"get","path":"/refreshToken"},{"method":"get","path":"/captcha"},{"method":"post","path":"/login"},{"method":"get","path":"/html"},{"method":"get","path":"/eps"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/department","name":"BaseSysDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/order"},{"method":"post","path":"/list"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/log","name":"BaseSysLogEntity","api":[{"method":"post","path":"/setKeep"},{"method":"get","path":"/getKeep"},{"method":"post","path":"/clear"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"姓名","nullable":true,"source":"b.name"},{"propertyName":"action","type":"string","length":"","comment":"行为","nullable":false,"source":"a.action"},{"propertyName":"ip","type":"string","length":"","comment":"ip","nullable":true,"source":"a.ip"}]}},{"prefix":"/admin/base/sys/menu","name":"BaseSysMenuEntity","api":[{"method":"post","path":"/create"},{"method":"post","path":"/export"},{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/parse"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/param","name":"BaseSysParamEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/html"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataType","type":"number","length":"","comment":"数据类型 0-字符串 1-富文本 2-文件 ","nullable":false,"defaultValue":0,"source":"a.dataType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"名称","nullable":false,"source":"a.name"},{"propertyName":"keyName","type":"string","length":"","comment":"键","nullable":false,"source":"a.keyName"}]}},{"prefix":"/admin/base/sys/role","name":"BaseSysRoleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"名称","nullable":false,"source":"a.name"},{"propertyName":"label","type":"string","length":"50","comment":"角色标签","nullable":true,"source":"a.label"}]}},{"prefix":"/admin/base/sys/user","name":"BaseSysUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/move"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/cs/chat","name":"CsChatEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"senderId","type":"number","length":"","comment":"发送人ID","nullable":false,"source":"a.senderId"},{"propertyName":"receiverId","type":"number","length":"","comment":"接收人ID","nullable":false,"source":"a.receiverId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"content","type":"text","length":"","comment":"消息内容","nullable":false,"source":"a.content"}]}},{"prefix":"/admin/cs/msg","name":"CsMsgEntity","api":[{"method":"get","path":"/unreadCount"},{"method":"post","path":"/read"},{"method":"post","path":"/send"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/cs/session","name":"CsSessionEntity","api":[{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/demo/goods","name":"DemoGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"状态","nullable":false,"defaultValue":1,"dict":["禁用","启用"],"source":"a.status"}],"fieldLike":[{"propertyName":"title","type":"string","length":"50","comment":"标题","nullable":false,"source":"a.title"}],"keyWordLikeFields":[{"propertyName":"description","type":"string","length":"","comment":"描述","nullable":true,"source":"a.description"}]}},{"prefix":"/admin/demo/tenant","name":"DemoGoodsEntity","api":[{"method":"post","path":"/noTenant"},{"method":"post","path":"/noUse"},{"method":"post","path":"/use"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/info","name":"DictInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/types"},{"method":"post","path":"/data"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/type","name":"DictTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/plugin/info","name":"PluginInfoEntity","api":[{"method":"post","path":"/install"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/recycle/data","name":"RecycleDataEntity","api":[{"method":"post","path":"/restore"},{"method":"get","path":"/info"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"userName","type":"string","length":"","comment":"姓名","nullable":true,"source":"b.name"},{"propertyName":"url","type":"string","length":"","comment":"请求的接口","nullable":true,"source":"a.url"}]}},{"prefix":"/admin/space/info","name":"SpaceInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"type","type":"string","length":"","comment":"类型","nullable":false,"source":"a.type"},{"propertyName":"classifyId","type":"number","length":"","comment":"分类ID","nullable":true,"source":"a.classifyId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/space/type","name":"SpaceTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/staff/info","name":"StaffInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"状态","nullable":false,"defaultValue":1,"dict":["禁用","在线","忙碌","离线"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"50","comment":"客服昵称","nullable":true,"source":"a.nickName"},{"propertyName":"account","type":"string","length":"50","comment":"客服账号","nullable":false,"source":"a.account"}]}},{"prefix":"/admin/staff/login","name":"","api":[{"method":"post","path":"/login"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/task/info","name":"TaskInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/start"},{"method":"post","path":"/once"},{"method":"post","path":"/stop"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"get","path":"/log"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"状态 0-停止 1-运行","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"状态 0-系统 1-用户","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/address","name":"UserAddressEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/info","name":"UserInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"状态","nullable":false,"defaultValue":1,"dict":["禁用","正常","已注销"],"source":"a.status"},{"propertyName":"gender","type":"number","length":"","comment":"性别","nullable":false,"defaultValue":0,"dict":["未知","男","女"],"source":"a.gender"},{"propertyName":"loginType","type":"number","length":"","comment":"登录方式","nullable":false,"defaultValue":0,"dict":["小程序","公众号","H5"],"source":"a.loginType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"昵称","nullable":true,"source":"a.nickName"},{"propertyName":"phone","type":"string","length":"","comment":"手机号","nullable":true,"source":"a.phone"}]}}] \ No newline at end of file diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..b5a1827 --- /dev/null +++ b/env.d.ts @@ -0,0 +1,10 @@ +/// + +interface ImportMetaEnv { + readonly VITE_NAME: string; + readonly VITE_TIMEOUT: number; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..a361065 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,73 @@ +import pluginVue from 'eslint-plugin-vue'; +import vueTsEslintConfig from '@vue/eslint-config-typescript'; +import prettier from 'eslint-plugin-prettier'; +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'; + +export default [ + { + name: 'app/files-to-lint', + files: ['**/*.{ts,mts,tsx,vue}'], + }, + + { + name: 'app/files-to-ignore', + ignores: [ + '**/dist/**', + '**/dist-ssr/**', + '**/coverage/**', + '**/packages/**', + '**/build/**', + ], + }, + + ...pluginVue.configs['flat/recommended'], + ...vueTsEslintConfig(), + skipFormatting, + + { + languageOptions: { + parserOptions: { + ecmaVersion: 2020, + ecmaFeatures: { + jsx: true, + }, + }, + }, + rules: { + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + 'space-before-function-paren': 'off', + 'no-unused-vars': 'off', + 'no-use-before-define': 'off', + 'no-self-assign': 'off', + 'vue/no-mutating-props': 'off', + 'vue/no-template-shadow': 'off', + 'vue/no-v-html': 'off', + 'vue/component-name-in-template-casing': ['error', 'kebab-case'], + 'vue/component-definition-name-casing': ['error', 'kebab-case'], + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/multi-word-component-names': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/html-self-closing': 'off', + 'vue/require-default-prop': 'off', + 'vue/v-on-event-hyphenation': 'off', + 'vue/block-lang': 'off', + }, + }, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000..1148b64 --- /dev/null +++ b/index.html @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ +
+ + + diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..2a02b0a --- /dev/null +++ b/nginx.conf @@ -0,0 +1,72 @@ +user nginx; +worker_processes 1; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; +events { + worker_connections 1024; +} +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + sendfile on; + keepalive_timeout 65; + upstream cool { + server midway:8001; + } + + server { + listen 80; + server_name localhost; + location / { + root /app; + index index.html; + try_files $uri $uri/ /index.html; + } + location /api/ { + proxy_pass http://cool/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header REMOTE-HOST $remote_addr; + + #缓存相关配置 + #proxy_cache cache_one; + #proxy_cache_key $host$request_uri$is_args$args; + #proxy_cache_valid 200 304 301 302 1h; + + #持久化连接相关配置 + proxy_connect_timeout 3000s; + proxy_read_timeout 86400s; + proxy_send_timeout 3000s; + #proxy_http_version 1.1; + #proxy_set_header Upgrade $http_upgrade; + #proxy_set_header Connection "upgrade"; + + add_header X-Cache $upstream_cache_status; + + #expires 12h; + } + + # socket需额外配置 + location /socket { + proxy_pass http://cool/socket; + proxy_connect_timeout 3600s; #配置点1 + proxy_read_timeout 3600s; #配置点2,如果没效,可以考虑这个时间配置长一点 + proxy_send_timeout 3600s; #配置点3 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header REMOTE-HOST $remote_addr; + #proxy_bind $remote_addr transparent; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + rewrite /socket/(.*) /$1 break; + proxy_redirect off; + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6148da5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5618 @@ +{ + "name": "cool-admin-vue", + "version": "8.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, + "@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true + }, + "@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "requires": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "requires": { + "@babel/types": "^7.27.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "requires": { + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + }, + "@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" + }, + "@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true + }, + "@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "requires": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "requires": { + "@babel/types": "^7.29.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + } + }, + "@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==" + }, + "@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + } + }, + "@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + } + }, + "@cool-vue/crud": { + "version": "8.0.6", + "requires": { + "@vue/runtime-core": "^3.5.13", + "element-plus": "^2.10.4", + "lodash-es": "^4.17.21", + "vue": "^3.5.13" + }, + "dependencies": { + "@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==" + }, + "@vueuse/core": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz", + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", + "requires": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.0.0", + "@vueuse/shared": "12.0.0", + "vue": "^3.5.13" + } + }, + "dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==" + }, + "element-plus": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.5.tgz", + "integrity": "sha512-dmY24fhSREfZN/PuUt0YZigMso7wWzl+B5o+YKNN15kQIn/0hzamsPU+ebj9SES0IbUqsLX1wkrzYmzU8VrVOQ==", + "requires": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "12.0.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "dependencies": { + "lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==" + } + } + } + } + }, + "@cool-vue/vite-plugin": { + "version": "8.2.2", + "dev": true, + "requires": { + "@vue/compiler-sfc": "^3.5.13", + "axios": "^1.6.8", + "glob": "^10.3.12", + "lodash": "^4.17.21", + "magic-string": "^0.30.17", + "prettier": "^3.4.2", + "svgo": "^3.3.2" + } + }, + "@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==" + }, + "@element-plus/icons-vue": { + "version": "2.3.1" + }, + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.4.3" + } + }, + "@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true + }, + "@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "requires": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true + }, + "@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.15" + } + }, + "@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "requires": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, + "espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "requires": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + } + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@eslint/js": { + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", + "dev": true + }, + "@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true + }, + "@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "requires": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + } + }, + "@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "requires": { + "@floating-ui/utils": "^0.2.11" + } + }, + "@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "requires": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==" + }, + "@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true + }, + "@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "requires": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true + }, + "@intlify/bundle-utils": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-10.0.1.tgz", + "integrity": "sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ==", + "dev": true, + "requires": { + "@intlify/message-compiler": "^11.1.2", + "@intlify/shared": "^11.1.2", + "acorn": "^8.8.2", + "escodegen": "^2.1.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" + } + }, + "@intlify/core-base": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.8.tgz", + "integrity": "sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ==", + "dev": true, + "requires": { + "@intlify/message-compiler": "10.0.8", + "@intlify/shared": "10.0.8" + }, + "dependencies": { + "@intlify/message-compiler": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.8.tgz", + "integrity": "sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg==", + "dev": true, + "requires": { + "@intlify/shared": "10.0.8", + "source-map-js": "^1.0.2" + } + }, + "@intlify/shared": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.8.tgz", + "integrity": "sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==", + "dev": true + } + } + }, + "@intlify/message-compiler": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.3.0.tgz", + "integrity": "sha512-RAJp3TMsqohg/Wa7bVF3cChRhecSYBLrTCQSj7j0UtWVFLP+6iEJoE2zb7GU5fp+fmG5kCbUdzhmlAUCWXiUJw==", + "dev": true, + "requires": { + "@intlify/shared": "11.3.0", + "source-map-js": "^1.0.2" + } + }, + "@intlify/shared": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.3.0.tgz", + "integrity": "sha512-LC6P/uay7rXL5zZ5+5iRJfLs/iUN8apu9tm8YqQVmW3Uq3X4A0dOFUIDuAmB7gAC29wTHOS3EiN/IosNSz0eNQ==", + "dev": true + }, + "@intlify/unplugin-vue-i18n": { + "version": "6.0.8", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@intlify/bundle-utils": "^10.0.1", + "@intlify/shared": "^11.1.2", + "@intlify/vue-i18n-extensions": "^8.0.0", + "@rollup/pluginutils": "^5.1.0", + "@typescript-eslint/scope-manager": "^8.13.0", + "@typescript-eslint/typescript-estree": "^8.13.0", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0", + "vue": "^3.4" + } + }, + "@intlify/vue-i18n-extensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@intlify/vue-i18n-extensions/-/vue-i18n-extensions-8.0.0.tgz", + "integrity": "sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.24.6", + "@intlify/shared": "^10.0.0", + "@vue/compiler-dom": "^3.2.45", + "vue-i18n": "^10.0.0" + }, + "dependencies": { + "@intlify/shared": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.8.tgz", + "integrity": "sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==", + "dev": true + }, + "vue-i18n": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.8.tgz", + "integrity": "sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==", + "dev": true, + "requires": { + "@intlify/core-base": "10.0.8", + "@intlify/shared": "10.0.8", + "@vue/devtools-api": "^6.5.0" + } + } + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "optional": true, + "requires": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6", + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "dev": true, + "optional": true + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true + }, + "@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true + }, + "@popperjs/core": { + "version": "npm:@sxzz/popperjs-es@2.11.8", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==" + }, + "@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "dev": true + }, + "@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + } + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "dev": true, + "optional": true + }, + "@rushstack/eslint-patch": { + "version": "1.12.0", + "dev": true + }, + "@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true + }, + "@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "@transloadit/prettier-bytes": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", + "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" + }, + "@tsconfig/node20": { + "version": "20.1.6", + "dev": true + }, + "@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true + }, + "@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "@types/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@types/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==" + }, + "@types/file-saver": { + "version": "2.0.7", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==" + }, + "@types/lodash-es": { + "version": "4.17.12", + "requires": { + "@types/lodash": "*" + } + }, + "@types/mockjs": { + "version": "1.0.10", + "dev": true + }, + "@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "requires": { + "undici-types": "~6.21.0" + } + }, + "@types/nprogress": { + "version": "0.2.3", + "dev": true + }, + "@types/store": { + "version": "2.0.5", + "dev": true + }, + "@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + } + }, + "@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + } + }, + "@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "requires": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + } + }, + "@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true + }, + "@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + } + }, + "@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "requires": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" + } + }, + "minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "requires": { + "brace-expansion": "^5.0.2" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true + } + } + }, + "@uppy/companion-client": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-2.2.2.tgz", + "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==", + "requires": { + "@uppy/utils": "^4.1.2", + "namespace-emitter": "^2.0.1" + } + }, + "@uppy/core": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz", + "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", + "requires": { + "@transloadit/prettier-bytes": "0.0.7", + "@uppy/store-default": "^2.1.1", + "@uppy/utils": "^4.1.3", + "lodash.throttle": "^4.1.1", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^3.1.25", + "preact": "^10.5.13" + } + }, + "@uppy/store-default": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-2.1.1.tgz", + "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==" + }, + "@uppy/utils": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-4.1.3.tgz", + "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==", + "requires": { + "lodash.throttle": "^4.1.1" + } + }, + "@uppy/xhr-upload": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", + "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", + "requires": { + "@uppy/companion-client": "^2.2.2", + "@uppy/utils": "^4.1.2", + "nanoid": "^3.1.25" + } + }, + "@vitejs/plugin-vue": { + "version": "5.2.4", + "dev": true + }, + "@vitejs/plugin-vue-jsx": { + "version": "4.2.0", + "dev": true, + "requires": { + "@babel/core": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1", + "@rolldown/pluginutils": "^1.0.0-beta.9", + "@vue/babel-plugin-jsx": "^1.4.0" + } + }, + "@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "requires": { + "@volar/source-map": "2.4.15" + } + }, + "@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true + }, + "@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "requires": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + } + }, + "@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + } + }, + "@vue/compiler-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "requires": { + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + }, + "dependencies": { + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "@vue/compiler-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "requires": { + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" + }, + "dependencies": { + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "@vue/compiler-sfc": { + "version": "3.5.18", + "requires": { + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + }, + "dependencies": { + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "@vue/compiler-ssr": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "requires": { + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" + }, + "dependencies": { + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, + "@vue/devtools-core": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.9.tgz", + "integrity": "sha512-48jrBSwG4GVQRvVeeXn9p9+dlx+ISgasM7SxZZKczseohB0cBz+ITKr4YbLWjmJdy45UHL7UMPlR4Y0CWTRcSQ==", + "dev": true, + "requires": { + "@vue/devtools-kit": "^7.7.9", + "@vue/devtools-shared": "^7.7.9", + "mitt": "^3.0.1", + "nanoid": "^5.1.0", + "pathe": "^2.0.3", + "vite-hot-client": "^2.0.4" + }, + "dependencies": { + "nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "dev": true + }, + "pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + } + } + }, + "@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "requires": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "requires": { + "rfdc": "^1.4.1" + } + }, + "@vue/eslint-config-prettier": { + "version": "10.2.0", + "dev": true, + "requires": { + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2" + } + }, + "@vue/eslint-config-typescript": { + "version": "14.6.0", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^8.35.1", + "fast-glob": "^3.3.3", + "typescript-eslint": "^8.35.1", + "vue-eslint-parser": "^10.2.0" + } + }, + "@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "requires": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + } + }, + "@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "requires": { + "@vue/shared": "3.5.30" + } + }, + "@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "requires": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "@vue/runtime-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "requires": { + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", + "csstype": "^3.1.3" + }, + "dependencies": { + "@vue/reactivity": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "requires": { + "@vue/shared": "3.5.18" + } + }, + "@vue/runtime-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "requires": { + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "@vue/server-renderer": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "requires": { + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" + }, + "dependencies": { + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==" + }, + "@vue/test-utils": { + "version": "2.4.6", + "dev": true, + "requires": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^2.0.0" + } + }, + "@vue/tsconfig": { + "version": "0.5.1", + "dev": true + }, + "@vueuse/core": { + "version": "12.8.2", + "requires": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "dependencies": { + "@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==" + }, + "@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==" + }, + "@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "requires": { + "vue": "^3.5.13" + } + } + } + }, + "@vueuse/metadata": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz", + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==" + }, + "@vueuse/shared": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz", + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", + "requires": { + "vue": "^3.5.13" + } + }, + "@wangeditor/basic-modules": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", + "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", + "requires": { + "is-url": "^1.2.4" + } + }, + "@wangeditor/code-highlight": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz", + "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==", + "requires": { + "prismjs": "^1.23.0" + } + }, + "@wangeditor/core": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz", + "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", + "requires": { + "@types/event-emitter": "^0.3.3", + "event-emitter": "^0.3.5", + "html-void-elements": "^2.0.0", + "i18next": "^20.4.0", + "scroll-into-view-if-needed": "^2.2.28", + "slate-history": "^0.66.0" + } + }, + "@wangeditor/editor": { + "version": "5.1.23", + "requires": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "^1.1.7", + "@wangeditor/code-highlight": "^1.0.3", + "@wangeditor/core": "^1.1.19", + "@wangeditor/list-module": "^1.0.5", + "@wangeditor/table-module": "^1.1.4", + "@wangeditor/upload-image-module": "^1.0.2", + "@wangeditor/video-module": "^1.1.4", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "@wangeditor/editor-for-vue": { + "version": "5.1.12" + }, + "@wangeditor/list-module": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz", + "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==" + }, + "@wangeditor/table-module": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@wangeditor/table-module/-/table-module-1.1.4.tgz", + "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==" + }, + "@wangeditor/upload-image-module": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz", + "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==" + }, + "@wangeditor/video-module": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@wangeditor/video-module/-/video-module-1.1.4.tgz", + "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==" + }, + "abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true + }, + "acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==" + }, + "ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true + }, + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + } + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "autoprefixer": { + "version": "10.4.21", + "dev": true, + "requires": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "1.11.0", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "baseline-browser-mapping": { + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz", + "integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==", + "dev": true + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true + }, + "birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "requires": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "requires": { + "run-applescript": "^7.0.0" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001778", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", + "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", + "dev": true + }, + "cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "requires": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + } + } + }, + "chardet": { + "version": "2.1.0" + }, + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "requires": { + "is-what": "^5.2.0" + } + }, + "core-js": { + "version": "3.44.0" + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "requires": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + } + }, + "css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "requires": { + "css-tree": "~2.2.0" + }, + "dependencies": { + "css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "requires": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + } + }, + "mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + } + } + }, + "csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + }, + "d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "requires": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + } + }, + "dayjs": { + "version": "1.11.13" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "requires": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + } + }, + "default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "optional": true + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "dom7": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz", + "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", + "requires": { + "ssr-window": "^3.0.0-alpha.1" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "echarts": { + "version": "5.6.0", + "requires": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "requires": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "dependencies": { + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true + }, + "element-plus": { + "version": "2.10.2", + "requires": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.13", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "dependencies": { + "@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" + }, + "@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "requires": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + } + }, + "@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + }, + "@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "requires": { + "vue-demi": "*" + } + } + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "engine.io-client": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==" + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "dev": true + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "requires": { + "d": "^1.0.2", + "ext": "^1.7.0" + } + }, + "esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "9.31.0", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.31.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true + }, + "espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "requires": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "5.5.3", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + } + }, + "eslint-plugin-vue": { + "version": "9.33.0", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + } + } + } + }, + "eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "requires": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + } + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "requires": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true + }, + "figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "requires": { + "is-unicode-supported": "^2.0.0" + } + }, + "file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "requires": { + "flat-cache": "^4.0.0" + } + }, + "file-saver": { + "version": "2.0.5" + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + } + }, + "flatted": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + }, + "foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + } + }, + "form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + } + }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "requires": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + } + }, + "glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true + }, + "i18next": { + "version": "20.6.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz", + "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==", + "requires": { + "@babel/runtime": "^7.12.0" + } + }, + "ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true + }, + "import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" + }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + }, + "dependencies": { + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + } + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true + }, + "is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true + }, + "js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "requires": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + } + }, + "js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + } + }, + "jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + }, + "lodash-es": { + "version": "4.17.21" + }, + "lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==" + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "marked": { + "version": "14.1.4" + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "requires": { + "wildcard": "^1.1.0" + } + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.2" + } + }, + "minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true + }, + "mitt": { + "version": "3.0.1" + }, + "mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "dev": true, + "requires": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + }, + "dependencies": { + "pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + } + } + }, + "mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" + }, + "nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true + }, + "nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "requires": { + "abbrev": "^2.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "requires": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "nprogress": { + "version": "0.2.0" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "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": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + } + }, + "pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pinia": { + "version": "2.3.1", + "requires": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + } + }, + "pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true + }, + "pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "requires": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + }, + "dependencies": { + "pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + } + } + }, + "postcss": { + "version": "8.5.6", + "requires": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "requires": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + } + }, + "postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "preact": { + "version": "10.29.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.0.tgz", + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.6.2", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "requires": { + "parse-ms": "^4.0.0" + } + }, + "prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "requires": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true + }, + "rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "@types/estree": "1.0.8", + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-visualizer": { + "version": "5.14.0", + "dev": true, + "requires": { + "open": "^8.4.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true + } + } + }, + "run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sass": { + "version": "1.81.0", + "dev": true, + "requires": { + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "dev": true + }, + "scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "requires": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + } + }, + "slate": { + "version": "0.72.8", + "resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz", + "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", + "requires": { + "immer": "^9.0.6", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "slate-history": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.66.0.tgz", + "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==", + "requires": { + "is-plain-object": "^5.0.0" + } + }, + "snabbdom": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.6.3.tgz", + "integrity": "sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==" + }, + "socket.io-client": { + "version": "4.8.3", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + } + }, + "sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true + }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "requires": { + "frac": "~1.1.2" + } + }, + "ssr-window": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz", + "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==" + }, + "store": { + "version": "2.0.12" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "requires": { + "ansi-regex": "^6.2.2" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, + "strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "requires": { + "copy-anything": "^4" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "dev": true, + "requires": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + } + }, + "synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.2.9" + } + }, + "tailwindcss": { + "version": "3.4.17", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "dependencies": { + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + } + } + }, + "terser": { + "version": "5.43.1", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "requires": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true + }, + "ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "5.5.4", + "dev": true + }, + "typescript-eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" + } + }, + "ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true + }, + "undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "requires": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + } + }, + "update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vite": { + "version": "5.4.19", + "dev": true, + "requires": { + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + } + }, + "vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "dev": true + }, + "vite-plugin-compression": { + "version": "0.5.1", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "debug": "^4.3.3", + "fs-extra": "^10.0.0" + } + }, + "vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "dependencies": { + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "requires": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + } + } + } + }, + "vite-plugin-vue-devtools": { + "version": "7.7.7", + "dev": true, + "requires": { + "@vue/devtools-core": "^7.7.7", + "@vue/devtools-kit": "^7.7.7", + "@vue/devtools-shared": "^7.7.7", + "execa": "^9.5.2", + "sirv": "^3.0.1", + "vite-plugin-inspect": "0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" + } + }, + "vite-plugin-vue-inspector": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.4.0.tgz", + "integrity": "sha512-Iq/024CydcE46FZqWPU4t4lw4uYOdLnFSO1RNxJVt2qY9zxIjmnkBqhHnYaReWM82kmNnaXs7OkfgRrV2GEjyw==", + "dev": true, + "requires": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + } + }, + "vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true + }, + "vue": { + "version": "3.5.18", + "requires": { + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" + }, + "dependencies": { + "@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==" + } + } + }, + "vue-component-type-helpers": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz", + "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==", + "dev": true + }, + "vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==" + }, + "vue-echarts": { + "version": "7.0.3", + "requires": { + "vue-demi": "^0.13.11" + }, + "dependencies": { + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==" + } + } + }, + "vue-eslint-parser": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", + "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "dev": true, + "requires": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true + }, + "espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "requires": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + } + } + } + }, + "vue-i18n": { + "version": "11.1.10", + "requires": { + "@intlify/core-base": "11.1.10", + "@intlify/shared": "11.1.10", + "@vue/devtools-api": "^6.5.0" + }, + "dependencies": { + "@intlify/core-base": { + "version": "11.1.10", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.1.10.tgz", + "integrity": "sha512-JhRb40hD93Vk0BgMgDc/xMIFtdXPHoytzeK6VafBNOj6bb6oUZrGamXkBKecMsmGvDQQaPRGG2zpa25VCw8pyw==", + "requires": { + "@intlify/message-compiler": "11.1.10", + "@intlify/shared": "11.1.10" + } + }, + "@intlify/message-compiler": { + "version": "11.1.10", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.1.10.tgz", + "integrity": "sha512-TABl3c8tSLWbcD+jkQTyBhrnW251dzqW39MPgEUCsd69Ua3ceoimsbIzvkcPzzZvt1QDxNkenMht+5//V3JvLQ==", + "requires": { + "@intlify/shared": "11.1.10", + "source-map-js": "^1.0.2" + } + }, + "@intlify/shared": { + "version": "11.1.10", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.1.10.tgz", + "integrity": "sha512-6ZW/f3Zzjxfa1Wh0tYQI5pLKUtU+SY7l70pEG+0yd0zjcsYcK0EBt6Fz30Dy0tZhEqemziQQy2aNU3GJzyrMUA==" + } + } + }, + "vue-router": { + "version": "4.5.1", + "requires": { + "@vue/devtools-api": "^6.6.4" + } + }, + "vue-tsc": { + "version": "2.2.12", + "dev": true, + "requires": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + } + }, + "vuedraggable": { + "version": "4.1.0", + "requires": { + "sortablejs": "1.14.0" + } + }, + "webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==" + }, + "wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "requires": { + "is-wsl": "^3.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "requires": { + "is-inside-container": "^1.0.0" + } + } + } + }, + "xlsx": { + "version": "0.18.5", + "requires": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true + }, + "yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true + }, + "zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "requires": { + "tslib": "2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..94fcbc2 --- /dev/null +++ b/package.json @@ -0,0 +1,77 @@ +{ + "name": "cool-admin-vue", + "version": "8.0.0", + "type": "module", + "scripts": { + "dev": "vite --host", + "build": "vite build", + "build-static": "vite build --mode static", + "build-demo": "vite build --mode demo", + "preview": "vite preview", + "type-check": "vue-tsc --build --force", + "lint": "eslint . --fix", + "format": "prettier --write src/" + }, + "dependencies": { + "@cool-vue/crud": "^8.0.6", + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "^12.5.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "axios": "^1.7.9", + "chardet": "^2.0.0", + "core-js": "^3.40.0", + "dayjs": "^1.11.13", + "echarts": "^5.6.0", + "element-plus": "2.10.2", + "file-saver": "^2.0.5", + "lodash-es": "^4.17.21", + "marked": "^14.1.3", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^2.3.1", + "socket.io-client": "^4.8.3", + "store": "^2.0.12", + "vue": "^3.5.13", + "vue-echarts": "^7.0.3", + "vue-i18n": "^11.0.1", + "vue-router": "^4.5.0", + "vuedraggable": "^4.1.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@cool-vue/vite-plugin": "^8.2.2", + "@intlify/unplugin-vue-i18n": "^6.0.3", + "@rushstack/eslint-patch": "^1.10.5", + "@tsconfig/node20": "^20.1.4", + "@types/file-saver": "^2.0.7", + "@types/lodash-es": "^4.17.12", + "@types/mockjs": "^1.0.10", + "@types/node": "^20.19.37", + "@types/nprogress": "^0.2.3", + "@types/store": "^2.0.5", + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "@vue/compiler-sfc": "^3.5.13", + "@vue/eslint-config-prettier": "^10.2.0", + "@vue/eslint-config-typescript": "^14.3.0", + "@vue/runtime-core": "^3.5.30", + "@vue/test-utils": "^2.4.6", + "@vue/tsconfig": "^0.5.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.19.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-vue": "^9.32.0", + "postcss": "^8.5.1", + "prettier": "^3.4.2", + "rollup-plugin-visualizer": "^5.14.0", + "sass": "1.81.0", + "tailwindcss": "^3.4.17", + "terser": "^5.36.0", + "typescript": "~5.5.4", + "vite": "^5.4.14", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-vue-devtools": "^7.7.1", + "vue-tsc": "^2.2.0" + } +} diff --git a/packages/crud/.gitignore b/packages/crud/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/packages/crud/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/crud/.prettierrc b/packages/crud/.prettierrc new file mode 100644 index 0000000..b82b0c6 --- /dev/null +++ b/packages/crud/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 4, + "useTabs": true, + "semi": true, + "jsxBracketSameLine": true, + "singleQuote": false, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/packages/crud/README.md b/packages/crud/README.md new file mode 100644 index 0000000..9500cde --- /dev/null +++ b/packages/crud/README.md @@ -0,0 +1,33 @@ +# 介绍 + +**cool-admin for vue**是基于[Vue.js](https://v3.cn.vuejs.org)开发。 + +[cool-admin 官方文档](https://cool-js.com/) + +尝试 `cool-admin` 最简单的方法就是查看文档及运行示例。 + + + +[Ai极速编码 🔥 在线体验](https://show.cool-admin.com/helper/ai-code) + + + +## 代码仓库 + +**cool-admin for vue** 是开源免费的,遵循[MIT](https://baike.baidu.com/item/MIT/10772952)开源协议,意味着您无需支付任何费用,也无需授权,即可将它应用到您的产品中。 + +开源免费,并不意味着您可以将 cool-admin 应用到非法的领域,比如涉及赌博,暴力等方面。如因此产生纠纷等法律问题,`cool-admin`不承担任何责任。 + +[https://github.com/cool-team-official/cool-admin-vue](https://github.com/cool-team-official/cool-admin-vue) + +```shell +git clone https://github.com/cool-team-official/cool-admin-vue.git +``` + +## 技术选型 + +- [Vue.js](https://v3.cn.vuejs.org),基础框架; +- [VueRouter](https://router.vuejs.org),Vue.js 官方路由; +- [Pinia](https://pinia.vuejs.org),轻量级状态管理库; +- [ElementPlus](https://element-plus.gitee.io/zh-CN),桌面端组件库; +- [Vite](https://vitejs.cn),构建工具; diff --git a/packages/crud/index.d.ts b/packages/crud/index.d.ts new file mode 100644 index 0000000..2d403ac --- /dev/null +++ b/packages/crud/index.d.ts @@ -0,0 +1,811 @@ +// vue +declare namespace Vue { + interface Ref { + value: T; + } + + type Emit = (name: any, ...args: any[]) => void; +} + +// element-plus +declare namespace ElementPlus { + type Size = "large" | "default" | "small"; + type Align = "left" | "center" | "right"; + + interface FormProps { + inline?: boolean; + labelPosition?: "left" | "right" | "top"; + labelWidth?: string | number; + labelSuffix?: string; + hideRequiredAsterisk?: boolean; + showMessage?: boolean; + inlineMessage?: boolean; + statusIcon?: boolean; + validateOnRuleChange?: boolean; + size?: Size; + disabled?: boolean; + [key: string]: any; + } +} + +// mitt +declare interface Mitt { + on(name: string, callback: (data: any) => void): void; + off(name: string, callback: (data: any) => void): void; + emit(name: string, data?: any): void; +} + +// emitter +declare interface EmitterItem { + name: string; + callback(data: any, events: { refresh(params: any): void; crudList: ClCrud.Ref[] }): void; +} + +declare interface Emitter { + list: EmitterItem[]; + init(events: any): void; + on(name: string, callback: (data: any) => void): void; + emit(name: string, data?: any): void; +} + +// 方法 +declare type fn = () => void; + +// 对象 +declare type obj = { + [key: string]: any; +}; + +// 全部可选 +declare type DeepPartial = T extends Function + ? T + : T extends object + ? { [P in keyof T]?: DeepPartial } + : T; + +// 合并 +declare type Merge = Omit & B; + +// 移除 [key] +declare type RemoveIndex = { + [P in keyof T as string extends P ? never : number extends P ? never : P]: T[P]; +}; + +// 任用列表 +declare type List = Array | (() => DeepPartial)>; + +// 获取keys +declare type PropKey = keyof RemoveIndex | (string & {}); + +// 任意字符串 +declare type AnyString = string & {}; + +// 类型或者 Ref 泛型 +declare type RefData = T | Vue.Ref; + +// browser +declare type Browser = { + screen: string; + isMini: boolean; +}; + +// 字典选项 +declare type DictOptions = { + label?: string; + value?: any; + color?: string; + type?: string; + [key: string]: any; +}[]; + +// render +declare namespace Render { + type OpButton = + | `slot-${string}` + | { + label: string; + type?: string; + hidden?: boolean; + onClick(options: { scope: obj }): void; + [key: string]: any; + }; + + interface Props { + onChange?(value: any): void; + [key: string]: any; + } + + interface Component { + name?: string; + options?: RefData; + props?: RefData; + style?: obj; + slots?: { + [key: string]: (data?: any) => any; + }; + vm?: any; + [key: string]: any; + } +} + +// crud +declare namespace ClCrud { + declare interface Field { + comment: string; + source: string; + propertyName: string; + type: string; + dict: string | string[]; + nullable: boolean; + } + + interface Label { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + placeholderSelect: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; + [key: string]: string; + } + + interface Dict { + primaryId: string; + api: { + list: string; + add: string; + update: string; + delete: string; + info: string; + page: string; + }; + pagination: { + page: string; + size: string; + }; + search: { + keyWord: string; + query: string; + }; + sort: { + order: string; + prop: string; + }; + label: Label; + } + + interface Permission { + page?: boolean; + list?: boolean; + add?: boolean; + delete?: boolean; + update?: boolean; + info?: boolean; + [key: string]: any; + } + + interface Params { + page: { + page?: number; + size?: number; + [key: string]: any; + }; + list: obj; + add: obj; + delete: { + ids?: any[]; + [key: string]: any; + }; + update: { + id?: any; + [key: string]: any; + }; + info: { + id?: any; + [key: string]: any; + }; + } + + interface Response { + page: { + list: any[]; + pagination: { + total: number; + page: number; + size: number; + [key: string]: any; + }; + [key: string]: any; + }; + list: any[]; + add: any; + update: any; + info: any; + delete: any; + } + + interface Service { + api: { + page(params?: Params["page"]): Promise; + list(params?: Params["list"]): Promise; + add(params?: Params["add"]): Promise; + update(params?: Params["update"]): Promise; + info(params?: Params["info"]): Promise; + delete(params?: Params["delete"]): Promise; + permission: Permission; + search: { + fieldEq: Field[]; + fieldLike: Field[]; + keyWordLikeFields: Field[]; + }; + [key: string]: any; + }; + } + + interface Config { + name: string; + service: Service["api"]; + permission: Permission; + dict: Dict; + onRefresh( + params: obj, + event: { + done: fn; + next: Service["api"]["page"]; + render: (data: any | any[], pagination?: Response["page"]["pagination"]) => void; + } + ): void; + onDelete( + selection: obj[], + event: { + next: Service["api"]["delete"]; + } + ): void; + } + + interface Ref { + "cl-table": ClTable.Ref; + "cl-upsert": ClUpsert.Ref; + id: number; + mitt: Mitt; + name: string; + routePath: string; + permission: Permission; + dict: Dict; + service: Service["api"]; + loading: boolean; + params: obj; + selection: obj[]; + set(key: "dict" | "style" | "service" | "permission", value: any): void; + done(): void; + getParams(): obj; + setParams(data: obj): void; + getPermission(key?: string): boolean; + rowInfo(data: obj): void; + rowAdd(): void; + rowEdit(data: obj): void; + rowAppend(data?: obj): void; + rowClose(): void; + rowDelete(...selection: obj[]): void; + proxy(name: string, data?: any[]): any; + paramsReplace(params: obj): obj; + refresh: Service["api"]["page"]; + [key: string]: any; + } + + interface Options extends DeepPartial { + service?: any; + } +} + +declare namespace ClTable { + type OpButton = Array<"info" | "edit" | "delete" | AnyString | Render.OpButton>; + + type ColumnType = "index" | "selection" | "expand" | "op" | AnyString; + + interface Column { + type: ColumnType; + hidden: RefData; + component: Render.Component; + search: { + isInput: boolean; + value: any; + icon: () => any; + refreshOnChange: boolean; + component: Render.Component; + }; + dict: RefData; + dictFormatter: (values: DictOptions) => string; + dictColor: boolean; + dictSeparator: string; + dictAllLevels: boolean; + buttons: OpButton | ((options: { scope: T }) => OpButton); + align: ElementPlus.Align; + label: any; + renderLabel: (options: { column: any; $index: number }) => any; + className: string; + prop: PropKey; + orderNum: number; + width: RefData; + minWidth: RefData; + renderHeader: (options: { column: any; $index: number }) => any; + sortable: boolean | "desc" | "descending" | "ascending" | "asc" | "custom"; + sortMethod: fn; + sortBy: string | ((row: T, index: number) => any) | any[]; + resizable: boolean; + columnKey: string; + headerAlign: ElementPlus.Align; + showOverflowTooltip: boolean; + fixed: boolean | string; + render: (row: T, column: any, value: any, index: number) => any; + formatter: (row: T, column: any, value: any, index: number) => any; + selectable: (row: T, index: number) => boolean; + reserveSelection: boolean; + filterMethod: fn; + filteredValue: unknown[]; + filters: unknown[]; + filterPlacement: string; + filterMultiple: boolean; + index: ((index: number) => number) | number; + sortOrders: unknown[]; + children: Column[]; + [key: string]: any; + } + + type ContextMenu = Array< + | ClContextMenu.Item + | ((row: obj, column: obj, event: PointerEvent) => ClContextMenu.Item) + | "refresh" + | "check" + | "update" + | "edit" + | "delete" + | "info" + | "order-desc" + | "order-asc" + >; + + type Plugin = (options: { exposed: Ref }) => void; + + interface Config { + columns: Column[]; + autoHeight: boolean; + height: any; + contextMenu: ContextMenu; + defaultSort: { + prop: string; + order: "descending" | "ascending"; + }; + sortRefresh: boolean; + emptyText: string; + rowKey: string; + on?: { + [key: string]: (...args: any[]) => void; + }; + props?: { + [key: string]: any; + }; + plugins?: Plugin[]; + onRowContextmenu?(row: T, column: any, event: any): void; + } + + interface Ref { + Table: any; + config: obj; + selection: T[]; + data: T[]; + columns: Column[]; + reBuild(cb?: fn): void; + calcMaxHeight(): void; + setData(data: T[]): void; + setColumns(columns: Column[]): void; + showColumn(props: PropKey | PropKey[], status?: boolean): void; + hideColumn(props: PropKey | PropKey[]): void; + changeSort(prop: PropKey, order: string): void; + clearSelection(): void; + getSelectionRows(): any[]; + toggleRowSelection(row: T, selected?: boolean): void; + toggleAllSelection(): void; + toggleRowExpansion(row: T, expanded?: boolean): void; + setCurrentRow(row: T): void; + clearSort(): void; + clearFilter(columnKeys: PropKey[]): void; + doLayout(): void; + sort(prop: PropKey, order: string): void; + scrollTo(position: { top?: number; left?: number }): void; + setScrollTop(top: number): void; + setScrollLeft(left: number): void; + updateKeyChildren(key: string, children: any[]): void; + } + + interface Options extends DeepPartial> { + columns?: List>; + } +} + +declare namespace ClFormTabs { + type labels = { + label: string; + value: string; + name?: string; + icon?: any; + lazy?: boolean; + [key: string]: any; + }[]; +} + +declare namespace ClForm { + type CloseAction = "close" | "save" | AnyString; + + interface Rule { + type?: + | "string" + | "number" + | "boolean" + | "method" + | "regexp" + | "integer" + | "float" + | "array" + | "object" + | "enum" + | "date" + | "url" + | "hex" + | "email" + | "any"; + required?: boolean; + message?: string; + min?: number; + max?: number; + trigger?: any; + validator?(rule: any, value: any, callback: (error?: Error) => void): void; + [key: string]: any; + } + + interface Hook { + Fn: (value: any, options: { form: obj; prop: string; method: "submit" | "bind" }) => any; + Key: + | "number" + | "string" + | "split" + | "join" + | "boolean" + | "booleanNumber" + | "datetimeRange" + | "splitJoin" + | "json" + | "empty" + | AnyString; + Pipe: Hook["Key"] | Hook["Fn"]; + Event: { + bind?: Hook["Pipe"] | Hook["Pipe"][]; + submit?: Hook["Pipe"] | Hook["Pipe"][]; + reset?: (prop: string) => string[]; + }; + } + + interface Item { + type?: "tabs"; + prop?: PropKey; + props?: { + labels?: ClFormTabs.labels; + justify?: "left" | "center" | "right"; + color?: string; + mergeProp?: boolean; + labelWidth?: string; + error?: string; + showMessage?: boolean; + inlineMessage?: boolean; + size?: "medium" | "default" | "small"; + [key: string]: any; + }; + span?: number; + col?: { + span: number; + offset: number; + push: number; + pull: number; + xs: any; + sm: any; + md: any; + lg: any; + xl: any; + tag: string; + }; + group?: string; + collapse?: boolean; + value?: any; + label?: string; + renderLabel?: any; + flex?: boolean; + hook?: Hook["Event"] | Hook["Key"]; + hidden?: boolean | ((options: { scope: obj }) => boolean); + prepend?: Render.Component; + component?: Render.Component; + append?: Render.Component; + rules?: Rule | Rule[]; + required?: boolean; + children?: Item[]; + [key: string]: any; + } + + interface Config { + title?: any; + height?: any; + width?: any; + props: ElementPlus.FormProps; + items: Item[]; + form: obj; + isReset?: boolean; + on?: { + open?(data: T): void; + close?(action: CloseAction, done: fn): void; + submit?(data: T, event: { close: fn; done: fn }): void; + change?(data: T, prop: string): void; + }; + op: { + hidden?: boolean; + saveButtonText?: string; + closeButtonText?: string; + justify?: "flex-start" | "center" | "flex-end"; + buttons?: Array; + }; + dialog: { + title?: any; + height?: string; + width?: string; + hideHeader?: boolean; + controls?: Array<"fullscreen" | "close" | AnyString>; + [key: string]: any; + }; + [key: string]: any; + } + + type Plugin = (options: { + exposed: Ref; + onOpen(cb: () => void): void; + onClose(cb: () => void): void; + onSubmit(cb: (data: obj) => obj): void; + }) => void; + + type Items = List>; + + interface Ref { + Form: any; + form: T; + config: { + items: Item[]; + [key: string]: any; + }; + open(options: Options, plugins?: Plugin[]): void; + close(action?: CloseAction): void; + done(): void; + clear(): void; + reset(): void; + showLoading(): void; + hideLoading(): void; + setDisabled(flag?: boolean): void; + invokeData(data: any): void; + setData(prop: string, value: any): void; + bindForm(data: obj): void; + getForm(prop?: string): any; + setForm(prop: string, value: any): void; + setOptions(prop: string, list: DictOptions): void; + setProps(prop: string, value: any): void; + setConfig(path: string, value: any): void; + showItem(props: string[] | string): void; + hideItem(props: string[] | string): void; + toggleItem(prop: string, flag?: boolean): void; + resetFields(): void; + clearValidate(props?: string[] | string): void; + validateField( + props?: string[] | string, + callback?: (isValid: boolean, invalidFields: any[]) => void + ): Promise; + validate(callback: (isValid: boolean, invalidFields: any[]) => void): Promise; + changeTab(value: any, valid?: boolean): Promise; + setTitle(value: string): void; + submit(cb?: (data: obj) => void): void; + Tabs: { + active: RefData; + list: ClFormTabs.labels; + change(value: any, valid?: boolean): Promise; + [key: string]: any; + }; + [key: string]: any; + } + + interface Options extends DeepPartial { + items?: Items; + } +} + +declare namespace ClUpsert { + interface Config { + sync: boolean; + items: ClForm.Item[]; + props: ClForm.Config["props"]; + op: ClForm.Config["op"]; + dialog: ClForm.Config["dialog"]; + onOpen?(): void; + onOpened?(data: T): void; + onClose?(action: ClForm.CloseAction, done: fn): void; + onClosed?(): void; + onInfo?( + data: T, + event: { close: fn; done(data: T): void; next: ClCrud.Service["api"]["info"] } + ): void; + onSubmit?( + data: T, + event: { close: fn; done: fn; next: ClCrud.Service["api"]["update"] } + ): void; + plugins?: ClForm.Plugin[]; + } + + interface Ref extends ClForm.Ref { + mode: "add" | "update" | "info" | AnyString; + } + + interface Options extends DeepPartial> { + items?: ClForm.Items; + } +} + +declare namespace ClAdvSearch { + interface Config { + items?: ClForm.Item[]; + title?: string; + size?: string | number; + op?: ("clear" | "reset" | "close" | "search" | `slot-${string}`)[]; + onSearch?(data: T, options: { next: ClCrud.Service["api"]["page"]; close(): void }): void; + } + + interface Ref extends ClForm.Ref {} + + interface Options extends DeepPartial> { + items?: ClForm.Items; + } +} + +declare namespace ClSearch { + type Plugin = (options: { exposed: Ref }) => void; + + interface Config { + inline?: boolean; + items?: ClForm.Item[]; + data?: T; + props?: ElementPlus.FormProps; + resetBtn?: boolean; + collapse?: boolean; + Form?: ClForm.Ref; + onChange?(data: T, prop: string): void; + onLoad?(data: T): void; + onSearch?(data: T, options: { next: ClCrud.Service["api"]["page"] }): void; + plugins?: Plugin[]; + } + + interface Ref extends ClForm.Ref { + search(params?: obj): void; + reset(): void; + } + + interface Options extends DeepPartial> { + items?: ClForm.Items; + } +} + +declare namespace ClContextMenu { + interface Item { + label: string; + prefixIcon?: any; + suffixIcon?: any; + ellipsis?: boolean; + disabled?: boolean; + hidden?: boolean; + children?: Item[]; + showChildren?: boolean; + callback?(done: fn): void; + [key: string]: any; + } + + interface Event { + pageX: number; + pageY: number; + [key: string]: any; + } + + interface Options { + class?: string; + hover?: + | boolean + | { + target?: string; + className?: string; + }; + list?: Item[]; + } + + interface Ref { + open(event: Event, options: Options): Exposed; + close(): void; + } + + interface Exposed { + close(): void; + } +} + +declare namespace ClDialog { + interface Provide { + visible: Vue.Ref; + fullscreen: Vue.Ref; + } +} + +declare interface Config { + dict: ClCrud.Dict; + permission: ClCrud.Permission; + events: { + [key: string]: (...args: any[]) => any; + }; + style: { + size: ElementPlus.Size; + colors: string[]; + form: { + labelPosition: ElementPlus.FormProps["labelPosition"]; + labelWidth: ElementPlus.FormProps["labelWidth"]; + span: number; + plugins: ClForm.Plugin[]; + }; + table: { + stripe: boolean; + border: boolean; + highlightCurrentRow: boolean; + resizable: boolean; + autoHeight: boolean; + contextMenu: ClTable.ContextMenu; + column: { + minWidth: number | string; + align: ElementPlus.Align; + headerAlign: ElementPlus.Align; + opWidth: number | string; + }; + plugins: ClTable.Plugin[]; + }; + search: { + plugins: ClSearch.Plugin[]; + }; + }; +} + +declare type Options = DeepPartial; + +declare interface CrudOptions { + options: Options; +} diff --git a/packages/crud/index.html b/packages/crud/index.html new file mode 100644 index 0000000..79f5bc6 --- /dev/null +++ b/packages/crud/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + +
+
+

+
+

+

+
+
+ +
+ + + diff --git a/packages/crud/package.json b/packages/crud/package.json new file mode 100644 index 0000000..9ababe6 --- /dev/null +++ b/packages/crud/package.json @@ -0,0 +1,38 @@ +{ + "name": "@cool-vue/crud", + "version": "8.0.6", + "private": false, + "main": "./dist/index.umd.js", + "module": "./dist/index.es.js", + "types": "types/entry.d.ts", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@vue/runtime-core": "^3.5.13", + "element-plus": "^2.10.4", + "lodash-es": "^4.17.21", + "vue": "^3.5.13" + }, + "devDependencies": { + "@types/node": "^20.11.16", + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "prettier": "^3.5.1", + "sass": "^1.85.0", + "sass-loader": "^16.0.5", + "typescript": "^5.3.3", + "vite": "^6.1.0", + "vite-plugin-dts": "^4.5.0", + "vue-tsc": "^2.2.2" + }, + "files": [ + "types", + "dist", + "index.d.ts", + "index.ts" + ] +} diff --git a/packages/crud/pnpm-lock.yaml b/packages/crud/pnpm-lock.yaml new file mode 100644 index 0000000..471c806 --- /dev/null +++ b/packages/crud/pnpm-lock.yaml @@ -0,0 +1,2350 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@vue/runtime-core': + specifier: ^3.5.13 + version: 3.5.13 + element-plus: + specifier: ^2.9.4 + version: 2.9.4(vue@3.5.13(typescript@5.7.3)) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + vue: + specifier: ^3.5.13 + version: 3.5.13(typescript@5.7.3) + devDependencies: + '@types/node': + specifier: ^20.11.16 + version: 20.17.19 + '@vitejs/plugin-vue': + specifier: ^5.2.1 + version: 5.2.1(vite@6.1.0(@types/node@20.17.19)(sass@1.85.0))(vue@3.5.13(typescript@5.7.3)) + '@vitejs/plugin-vue-jsx': + specifier: ^4.1.1 + version: 4.1.1(vite@6.1.0(@types/node@20.17.19)(sass@1.85.0))(vue@3.5.13(typescript@5.7.3)) + prettier: + specifier: ^3.5.1 + version: 3.5.1 + sass: + specifier: ^1.85.0 + version: 1.85.0 + sass-loader: + specifier: ^16.0.5 + version: 16.0.5(sass@1.85.0) + typescript: + specifier: ^5.3.3 + version: 5.7.3 + vite: + specifier: ^6.1.0 + version: 6.1.0(@types/node@20.17.19)(sass@1.85.0) + vite-plugin-dts: + specifier: ^4.5.0 + version: 4.5.0(@types/node@20.17.19)(rollup@4.34.8)(typescript@5.7.3)(vite@6.1.0(@types/node@20.17.19)(sass@1.85.0)) + vue-tsc: + specifier: ^2.2.2 + version: 2.2.2(typescript@5.7.3) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.9': + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.26.9': + resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.9': + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.26.8': + resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@microsoft/api-extractor-model@7.30.3': + resolution: {integrity: sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==} + + '@microsoft/api-extractor@7.50.0': + resolution: {integrity: sha512-Ds/PHTiVzuENQsmXrJKkSdfgNkr/SDG/2rDef0AWl3BchAnXdO7gXaYsAkNx4gWiC4OngNA3fQfd3+BcQxP1DQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.11.0': + resolution: {integrity: sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.15.0': + resolution: {integrity: sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.23.5': + resolution: {integrity: sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.15': + resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@vitejs/plugin-vue-jsx@4.1.1': + resolution: {integrity: sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + + '@vue/babel-helper-vue-transform-on@1.2.5': + resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==} + + '@vue/babel-plugin-jsx@1.2.5': + resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.5': + resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@2.2.2': + resolution: {integrity: sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + 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@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + alien-signals@1.0.3: + resolution: {integrity: sha512-zQOh3wAYK5ujENxvBBR3CFGF/b6afaSzZ/c9yNhJ1ENrGHETvpUuKQsa93Qrclp0+PzTF93MaZ7scVp1uUozhA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + 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==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + electron-to-chromium@1.5.102: + resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==} + + element-plus@2.9.4: + resolution: {integrity: sha512-sGnW0wd9zf6lEGixXV2gfwx3X6VTMkP52qTkX7zbURJ2oariyslrKTBh2txt1sdn1pUvj2l0KY3OfSXoZGmDOw==} + peerDependencies: + vue: ^3.2.0 + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + immutable@5.0.3: + resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + 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'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + 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.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + 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.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + 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.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.5.1: + resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + 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@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sass-loader@16.0.5: + resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + webpack: + optional: true + + sass@1.85.0: + resolution: {integrity: sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==} + engines: {node: '>=14.0.0'} + 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 + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + 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'} + + 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'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite-plugin-dts@4.5.0: + resolution: {integrity: sha512-M1lrPTdi7gilLYRZoLmGYnl4fbPryVYsehPN9JgaxjJKTs8/f7tuAlvCCvOLB5gRDQTTKnptBcB0ACsaw2wNLw==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-tsc@2.2.2: + resolution: {integrity: sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.9': + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.9': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/traverse@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue: 3.5.13(typescript@5.7.3) + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@microsoft/api-extractor-model@7.30.3(@types/node@20.17.19)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.11.0(@types/node@20.17.19) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.50.0(@types/node@20.17.19)': + dependencies: + '@microsoft/api-extractor-model': 7.30.3(@types/node@20.17.19) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.11.0(@types/node@20.17.19) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.0(@types/node@20.17.19) + '@rushstack/ts-command-line': 4.23.5(@types/node@20.17.19) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.7.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.10 + + '@microsoft/tsdoc@0.15.1': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@rollup/pluginutils@5.1.4(rollup@4.34.8)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.34.8 + + '@rollup/rollup-android-arm-eabi@4.34.8': + optional: true + + '@rollup/rollup-android-arm64@4.34.8': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.8': + optional: true + + '@rollup/rollup-darwin-x64@4.34.8': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.8': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.8': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.8': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.8': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.8': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.8': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.8': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.8': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.8': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.8': + optional: true + + '@rushstack/node-core-library@5.11.0(@types/node@20.17.19)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + optionalDependencies: + '@types/node': 20.17.19 + + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.10 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.15.0(@types/node@20.17.19)': + dependencies: + '@rushstack/node-core-library': 5.11.0(@types/node@20.17.19) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.17.19 + + '@rushstack/ts-command-line@4.23.5(@types/node@20.17.19)': + dependencies: + '@rushstack/terminal': 0.15.0(@types/node@20.17.19) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@sxzz/popperjs-es@2.11.7': {} + + '@types/argparse@1.0.38': {} + + '@types/estree@1.0.6': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.15 + + '@types/lodash@4.17.15': {} + + '@types/node@20.17.19': + dependencies: + undici-types: 6.19.8 + + '@types/web-bluetooth@0.0.16': {} + + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.1.0(@types/node@20.17.19)(sass@1.85.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.9) + vite: 6.1.0(@types/node@20.17.19)(sass@1.85.0) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.1(vite@6.1.0(@types/node@20.17.19)(sass@1.85.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + vite: 6.1.0(@types/node@20.17.19)(sass@1.85.0) + vue: 3.5.13(typescript@5.7.3) + + '@volar/language-core@2.4.11': + dependencies: + '@volar/source-map': 2.4.11 + + '@volar/source-map@2.4.11': {} + + '@volar/typescript@2.4.11': + dependencies: + '@volar/language-core': 2.4.11 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/babel-helper-vue-transform-on@1.2.5': {} + + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.9)': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.9) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.9)': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/parser': 7.26.9 + '@vue/compiler-sfc': 3.5.13 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.9 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.9 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.2 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.7.3)': + dependencies: + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.7.3 + + '@vue/language-core@2.2.2(typescript@5.7.3)': + dependencies: + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 1.0.3 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.7.3 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + + '@vue/shared@3.5.13': {} + + '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + acorn@8.14.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@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + alien-signals@0.4.14: {} + + alien-signals@1.0.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + async-validator@4.2.5: {} + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + optional: true + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001700 + electron-to-chromium: 1.5.102 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + caniuse-lite@1.0.30001700: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + convert-source-map@2.0.0: {} + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + detect-libc@1.0.3: + optional: true + + electron-to-chromium@1.5.102: {} + + element-plus@2.9.4(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.3)) + '@floating-ui/dom': 1.6.13 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.15 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3)) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - '@vue/composition-api' + + entities@4.5.0: {} + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + estree-walker@2.0.2: {} + + fast-deep-equal@3.1.3: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + optional: true + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + globals@11.12.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + html-tags@3.3.1: {} + + immutable@5.0.3: {} + + import-lazy@4.0.0: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-number@7.0.0: + optional: true + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kolorist@1.8.0: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + 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.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + memoize-one@6.0.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.8: {} + + neo-async@2.6.2: {} + + node-addon-api@7.1.1: + optional: true + + node-releases@2.0.19: {} + + normalize-wheel-es@1.2.0: {} + + path-browserify@1.0.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: + optional: true + + picomatch@4.0.2: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + postcss@8.5.2: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.5.1: {} + + punycode@2.3.1: {} + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup@4.34.8: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 + fsevents: 2.3.3 + + sass-loader@16.0.5(sass@1.85.0): + dependencies: + neo-async: 2.6.2 + optionalDependencies: + sass: 1.85.0 + + sass@1.85.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + string-argv@0.3.2: {} + + strip-json-comments@3.1.1: {} + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + optional: true + + typescript@5.7.2: {} + + typescript@5.7.3: {} + + ufo@1.5.4: {} + + undici-types@6.19.8: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite-plugin-dts@4.5.0(@types/node@20.17.19)(rollup@4.34.8)(typescript@5.7.3)(vite@6.1.0(@types/node@20.17.19)(sass@1.85.0)): + dependencies: + '@microsoft/api-extractor': 7.50.0(@types/node@20.17.19) + '@rollup/pluginutils': 5.1.4(rollup@4.34.8) + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.0(typescript@5.7.3) + compare-versions: 6.1.1 + debug: 4.4.0 + kolorist: 1.8.0 + local-pkg: 0.5.1 + magic-string: 0.30.17 + typescript: 5.7.3 + optionalDependencies: + vite: 6.1.0(@types/node@20.17.19)(sass@1.85.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@6.1.0(@types/node@20.17.19)(sass@1.85.0): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.2 + rollup: 4.34.8 + optionalDependencies: + '@types/node': 20.17.19 + fsevents: 2.3.3 + sass: 1.85.0 + + vscode-uri@3.1.0: {} + + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue-tsc@2.2.2(typescript@5.7.3): + dependencies: + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.2(typescript@5.7.3) + typescript: 5.7.3 + + vue@3.5.13(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.3 + + yallist@3.1.1: {} + + yallist@4.0.0: {} diff --git a/packages/crud/src/App.vue b/packages/crud/src/App.vue new file mode 100644 index 0000000..32f62ac --- /dev/null +++ b/packages/crud/src/App.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/packages/crud/src/components/add-btn/index.tsx b/packages/crud/src/components/add-btn/index.tsx new file mode 100644 index 0000000..1f42fac --- /dev/null +++ b/packages/crud/src/components/add-btn/index.tsx @@ -0,0 +1,21 @@ +import { defineComponent } from "vue"; +import { useConfig, useCore } from "../../hooks"; + +export default defineComponent({ + name: "cl-add-btn", + + setup(_, { slots }) { + const { crud } = useCore(); + const { style } = useConfig(); + + return () => { + return ( + crud.getPermission("add") && ( + + {slots.default?.() || crud.dict.label.add} + + ) + ); + }; + } +}); diff --git a/packages/crud/src/components/adv/btn.tsx b/packages/crud/src/components/adv/btn.tsx new file mode 100644 index 0000000..34b4da5 --- /dev/null +++ b/packages/crud/src/components/adv/btn.tsx @@ -0,0 +1,31 @@ +import { useConfig, useCore } from "../../hooks"; +import { defineComponent } from "vue"; +import { Search } from "@element-plus/icons-vue"; + +export default defineComponent({ + name: "cl-adv-btn", + + components: { + Search + }, + + setup(_, { slots }) { + const { crud, mitt } = useCore(); + const { style } = useConfig(); + + function open() { + mitt.emit("crud.openAdvSearch"); + } + + return () => { + return ( + + + + + {slots.default?.() || crud.dict.label.advSearch} + + ); + }; + } +}); diff --git a/packages/crud/src/components/adv/search.tsx b/packages/crud/src/components/adv/search.tsx new file mode 100644 index 0000000..b94300c --- /dev/null +++ b/packages/crud/src/components/adv/search.tsx @@ -0,0 +1,203 @@ +import { defineComponent, h, inject, mergeProps, nextTick, type PropType, reactive, ref } from "vue"; +import { Close } from "@element-plus/icons-vue"; +import { useBrowser, useConfig, useCore } from "../../hooks"; +import { renderNode } from "../../utils/vnode"; +import { useApi } from "../form/helper"; +import { isArray } from "lodash-es"; + +export default defineComponent({ + name: "cl-adv-search", + + components: { + Close + }, + + props: { + // 表单项 + items: { + type: Array as PropType, + default: () => [] + }, + // 标题 + title: String, + // 窗体大小 + size: { + type: [Number, String], + default: "30%" + }, + // 操作按钮 + op: { + type: Array, + default: () => ["clear", "reset", "close", "search"] + }, + // 搜索钩子 + onSearch: Function + }, + + emits: ["reset", "clear"], + + setup(props, { emit, slots, expose }) { + const { crud, mitt } = useCore(); + const { style } = useConfig(); + const browser = useBrowser(); + + // 配置 + const config = reactive( + mergeProps(props, inject("useAdvSearch__options") || {}) + ); + + // cl-form + const Form = ref(); + + // el-drawer + const Drawer = ref(); + + // 是否可见 + const visible = ref(false); + + // 打开 + function open() { + visible.value = true; + + nextTick(() => { + Form.value?.open({ + items: config.items || [], + op: { + hidden: true + }, + isReset: false + }); + }); + } + + // 关闭 + function close() { + Drawer.value.handleClose(); + } + + // 重置数据 + function reset() { + const d: any = {}; + + config.items?.map((e) => { + if (typeof e.hook != 'string' && e.hook?.reset) { + const props = e.hook.reset(e.prop!) + + if (isArray(props)) { + props.forEach((prop) => { + d[prop] = undefined; + }) + } + } + + d[e.prop!] = undefined; + }); + + // 重置表单 + Form.value?.reset(); + + // 列表刷新 + search(); + + // 重置事件 + emit("reset", d); + } + + // 清空数据 + function clear() { + Form.value?.clear(); + emit("clear"); + } + + // 搜素请求 + function search(params?: any) { + const form = Form.value?.getForm(); + + function next(data: any) { + Form.value?.done(); + close(); + + return crud.refresh({ + ...data, + ...params, + page: 1 + }); + } + + if (config.onSearch) { + config.onSearch(form, { next, close }); + } else { + next(form); + } + } + + // 消息事件 + mitt.on("crud.openAdvSearch", open); + + // 渲染表单 + function renderForm() { + return h(, {}, slots); + } + + // 渲染底部 + function renderFooter() { + const fns = { search, reset, clear, close }; + + return config.op?.map((e: string) => { + switch (e) { + case "search": + case "reset": + case "clear": + case "close": + return h( + , + { + type: e == "search" ? "primary" : null, + size: style.size, + onClick: () => { + fns[e]() + } + }, + { default: () => crud.dict.label[e] } + ); + + default: + return renderNode(e, { + scope: Form.value?.getForm(), + slots + }); + } + }); + } + + expose({ + open, + close, + clear, + ...useApi({ Form }), + reset, + Form + }); + + return () => { + return ( + +
+ {config.title || crud.dict.label.advSearch} + + + +
+
{renderForm()}
+ +
+ ); + }; + } +}); diff --git a/packages/crud/src/components/context-menu/index.tsx b/packages/crud/src/components/context-menu/index.tsx new file mode 100644 index 0000000..a9fc39c --- /dev/null +++ b/packages/crud/src/components/context-menu/index.tsx @@ -0,0 +1,282 @@ +import { + defineComponent, + nextTick, + onMounted, + reactive, + ref, + h, + render, + toRaw, + type PropType +} from "vue"; +import { isString } from "lodash-es"; +import { addClass, contains, removeClass } from "../../utils"; +import { useRefs } from "../../hooks"; +import { ElIcon } from "element-plus"; +import { ArrowRight } from "@element-plus/icons-vue"; + +const ClContextMenu = defineComponent({ + name: "cl-context-menu", + + props: { + show: Boolean, + options: { + type: Object as PropType, + default: () => ({}) + }, + event: { + type: Object, + default: () => ({}) + } + }, + + setup(props, { expose, slots }) { + const { refs, setRefs } = useRefs(); + + // 是否可见 + const visible = ref(props.show || false); + + // 按钮列表 + const list = ref([]); + + // 样式 + const style = reactive({ + left: "0px", + top: "0px" + }); + + // 选中值 + const ids = ref(""); + + // 阻止默认事件 + function stopDefault(e: any) { + if (e.preventDefault) { + e.preventDefault(); + } + + if (e.stopPropagation) { + e.stopPropagation(); + } + } + + // 解析列表 + function parseList(list: ClContextMenu.Item[]) { + function deep(list: ClContextMenu.Item[]) { + list.forEach((e) => { + e.showChildren = false; + + if (e.children) { + deep(e.children); + } + }); + } + + deep(list); + + return list; + } + + // 目标元素 + let targetEl: any; + + // 关闭 + function close() { + visible.value = false; + ids.value = ""; + + if (targetEl) { + removeClass(targetEl, "cl-context-menu__target"); + } + } + + // 打开 + function open(event: any, options: ClContextMenu.Options = {}) { + // 阻止默认事件 + stopDefault(event); + + // 显示 + visible.value = true; + + // 元素 + const el = refs["context-menu"].querySelector(".cl-context-menu__box") as HTMLElement; + + // 点击样式 + if (options?.hover) { + const d = options.hover === true ? {} : options.hover; + targetEl = event.target; + + if (targetEl && isString(targetEl.className)) { + if (d.target) { + while (!targetEl.className.includes(d.target)) { + targetEl = targetEl.parentNode; + } + } + + addClass(targetEl, d.className || "cl-context-menu__target"); + } + } + + // 自定义样式 + if (options?.class) { + addClass(el, options.class); + } + + // 菜单列表 + if (options?.list) { + list.value = parseList(options.list); + } + + nextTick(() => { + // 计算位置 + let left = event.pageX; + let top = event.pageY; + + // 组件方式用 offset 计算 + if (!props.show) { + left = event.offsetX; + top = event.offsetY; + } + + const { clientHeight: h1, clientWidth: w1 } = event.target?.ownerDocument.body; + const { clientHeight: h2, clientWidth: w2 } = el; + + if (top + h2 > h1) { + top = h1 - h2 - 5; + } + + if (left + w2 > w1) { + left = w1 - w2 - 5; + } + + style.left = left + "px"; + style.top = top + "px"; + }) + + return { + close + }; + } + + // 行点击 + function rowClick(item: ClContextMenu.Item, id: string) { + ids.value = id; + + if (item.disabled) { + return false; + } + + if (item.callback) { + return item.callback(close); + } + + if (item.children) { + item.showChildren = !item.showChildren; + } else { + close(); + } + } + + expose({ + open, + close + }); + + onMounted(function () { + if (visible.value) { + const { body, documentElement } = props.event.target.ownerDocument; + + // 添加到 body 下 + body.appendChild(refs["context-menu"]); + // 关闭事件 + (documentElement || body).addEventListener("mousedown", (e: any) => { + const el = refs["context-menu"]; + if (!contains(el, e.target) && el != e.target) { + close(); + } + }); + + // 默认打开 + open(props.event, props?.options); + } + }); + + return () => { + function deep(list: ClContextMenu.Item[], pId: string, level: number) { + return ( +
1 && "is-append"]}> + {list + .filter((e) => !e.hidden) + .map((e, i) => { + const id = `${pId}-${i}`; + + if (!e.suffixIcon) { + // 默认图标 + if (e.children) { + e.suffixIcon = ArrowRight; + } + } + + return ( +
{ + rowClick(e, id); + ev.stopPropagation(); + }} + > + {/* 前缀图标 */} + {e.prefixIcon && {h(toRaw(e.prefixIcon))}} + + {/* 标题 */} + + {e.label} + + + {/* 后缀图标 */} + {e.suffixIcon && {h(toRaw(e.suffixIcon))}} + + {/* 子集 */} + {e.children && + e.showChildren && + deep(e.children, id, level + 1)} +
+ ); + })} +
+ ); + } + + return ( + visible.value && ( +
+ {slots.default ? slots.default() : deep(list.value, "0", 1)} +
+ ) + ); + }; + } +}); + +export const ContextMenu = { + open(event: any, options: ClContextMenu.Options) { + const vm = h(ClContextMenu, { + show: true, + event, + options + }); + + render(vm, event.target.ownerDocument.createElement("div")); + + return vm.component?.exposed as ClContextMenu.Exposed; + } +}; + +export default ClContextMenu; diff --git a/packages/crud/src/components/crud/helper.ts b/packages/crud/src/components/crud/helper.ts new file mode 100644 index 0000000..ea25316 --- /dev/null +++ b/packages/crud/src/components/crud/helper.ts @@ -0,0 +1,287 @@ +import { ElMessageBox, ElMessage } from "element-plus"; +import { Mitt } from "../../utils/mitt"; +import { ref } from "vue"; +import { assign, isArray, isFunction } from "lodash-es"; +import { merge } from "../../utils"; + +interface Options { + mitt: Mitt; + config: ClCrud.Config; + crud: ClCrud.Ref; +} + +export function useHelper({ config, crud, mitt }: Options) { + // 刷新随机值,避免脏数据 + const refreshRd = ref(0); + + // 获取权限 + function getPermission(key: "page" | "list" | "info" | "update" | "add" | "delete"): boolean { + return Boolean(crud.permission[key]); + } + + // 根据字典替换请求参数 + function paramsReplace(params: obj) { + const { pagination, search, sort } = crud.dict; + + // 请求参数 + const a: any = { ...params }; + + // 字典 + const b: any = { ...pagination, ...search, ...sort }; + + for (const i in b) { + if (a[i]) { + if (i != b[i]) { + a[`_${b[i]}`] = a[i]; + + delete a[i]; + } + } + } + + for (const i in a) { + if (i[0] === "_") { + a[i.substr(1)] = a[i]; + + delete a[i]; + } + } + + return a; + } + + // 刷新请求 + function refresh(params?: obj) { + const { service, dict } = crud; + + return new Promise((success, error) => { + // 合并请求参数 + const reqParams = paramsReplace(assign(crud.params, params)); + + // Loading + crud.loading = true; + + // 预防脏数据 + const rd = (refreshRd.value = Math.random()); + + // 完成事件 + function done() { + crud.loading = false; + } + + // 渲染 + function render(data: any | any[], pagination?: any) { + const res = isArray(data) ? { list: data, pagination } : data; + done(); + success(res); + mitt.emit("crud.refresh", res); + } + + // 下一步 + function next(params: obj): Promise { + return new Promise(async (resolve, reject) => { + await service[dict.api.page](params) + .then((res) => { + if (rd != refreshRd.value) { + return false; + } + + if (isArray(res)) { + res = { + list: res, + pagination: { + total: res.length + } + }; + } + + render(res); + resolve(res); + }) + .catch((err) => { + ElMessage.error(err.message); + error(err); + reject(err); + }); + + done(); + }); + } + + // 刷新钩子 + if (config.onRefresh) { + config.onRefresh(reqParams, { next, done, render }); + } else { + next(reqParams); + } + }); + } + + // 打开详情 + function rowInfo(data: any) { + mitt.emit("crud.proxy", { + name: "info", + data: [data] + }); + } + + // 打开新增 + function rowAdd() { + mitt.emit("crud.proxy", { + name: "add" + }); + } + + // 打开编辑 + function rowEdit(data: any) { + mitt.emit("crud.proxy", { + name: "edit", + data: [data] + }); + } + + // 打开追加 + function rowAppend(data: any) { + mitt.emit("crud.proxy", { + name: "append", + data: [data] + }); + } + + // 关闭新增、编辑弹窗 + function rowClose() { + mitt.emit("crud.proxy", { + name: "close" + }); + } + + // 删除请求 + function rowDelete(...selection: any[]) { + const { service, dict } = crud; + + // 参数 + const params = { + ids: selection.map((e) => e[dict.primaryId]) + }; + + // 下一步 + async function next(data: obj) { + return new Promise((resolve, reject) => { + ElMessageBox({ + type: "warning", + title: dict.label.tips, + message: dict.label.deleteConfirm, + confirmButtonText: dict.label.confirm, + cancelButtonText: dict.label.close, + showCancelButton: true, + async beforeClose(action, instance, done) { + if (action === "confirm") { + instance.confirmButtonLoading = true; + + await service[dict.api.delete]({ ...params, ...data }) + .then((res) => { + ElMessage.success(dict.label.deleteSuccess); + + refresh(); + resolve(res); + }) + .catch((err) => { + ElMessage.error(err.message); + reject(err); + }); + + instance.confirmButtonLoading = false; + } + + done(); + } + }).catch(() => null); + }); + } + + // 删除钩子 + if (config.onDelete) { + config.onDelete(selection, { next }); + } else { + next(params); + } + } + + // 代理 + function proxy(name: string, data?: any[]) { + mitt.emit("crud.proxy", { + name, + data + }); + } + + // 获取请求参数 + function getParams() { + return crud.params; + } + + // 替换请求参数 + function setParams(data: obj) { + merge(crud.params, data); + } + + // 设置 + function set(key: string, value: any) { + if (!value) { + return false; + } + + switch (key) { + // 服务 + case "service": + Object.assign(crud.service, value); + crud.service.__proto__ = value.__proto__; + if (value._permission) { + for (const i in value._permission) { + crud.permission[i] = value._permission[i]; + } + } + break; + + // 权限 + case "permission": + if (isFunction(value)) { + merge(crud.permission, value(crud)); + } else { + merge(crud.permission, value); + } + break; + + default: + merge(crud[key], value); + break; + } + } + + // 监听事件 + function on(name: string, callback: fn) { + mitt.on(`${name}-${crud.id}`, callback); + } + + // 默认值 + set("dict", config.dict); + set("service", config.service); + set("permission", config.permission); + + return { + proxy, + set, + on, + rowInfo, + rowAdd, + rowEdit, + rowAppend, + rowDelete, + rowClose, + refresh, + getPermission, + paramsReplace, + getParams, + setParams + }; +} diff --git a/packages/crud/src/components/crud/index.tsx b/packages/crud/src/components/crud/index.tsx new file mode 100644 index 0000000..a87a7b4 --- /dev/null +++ b/packages/crud/src/components/crud/index.tsx @@ -0,0 +1,91 @@ +import { defineComponent, getCurrentInstance, inject, provide, reactive } from "vue"; +import { cloneDeep } from "lodash-es"; +import { useHelper } from "./helper"; +import { Mitt } from "../../utils/mitt"; +import { mergeConfig, merge } from "../../utils"; +import { crudList } from "../../emitter"; +import { useConfig } from "../../hooks"; + +export default defineComponent({ + name: "cl-crud", + + props: { + // 组件名 + name: String, + // 是否有边框 + border: Boolean, + // 内间距 + padding: { + type: String, + default: "10px" + } + }, + + setup(props, { slots, expose }) { + // 当前实例 + const inst = getCurrentInstance(); + + // 配置 + const config = reactive(mergeConfig(inject("useCrud__options") || {})); + + // 事件 + const mitt = new Mitt(inst?.uid); + + // 全局配置 + const { dict, permission } = useConfig(); + + // 参数 + const crud = reactive( + merge( + { + id: props.name || inst?.uid, + // 绑定的路由地址 + routePath: location.pathname || "/", + // 表格加载状态 + loading: false, + // 表格已选列 + selection: [], + // 请求参数 + params: { + page: 1, + size: 20 + }, + // 请求服务 + service: {}, + // 字典 + dict: {}, + // 权限 + permission: {}, + // 事件 + mitt, + // 配置 + config + }, + cloneDeep({ dict, permission }) + ) + ); + + // 追加参数 + merge(crud, useHelper({ config, crud, mitt })); + + // 集合 + crudList.push(crud); + + // 值穿透 + provide("crud", crud); + provide("mitt", mitt); + + // 导出 + expose(crud); + + return () => { + return ( +
+ {slots.default?.()} +
+ ); + }; + } +}); diff --git a/packages/crud/src/components/dialog/index.tsx b/packages/crud/src/components/dialog/index.tsx new file mode 100644 index 0000000..8aa9544 --- /dev/null +++ b/packages/crud/src/components/dialog/index.tsx @@ -0,0 +1,288 @@ +import { defineComponent, h, ref, watch, computed, provide } from "vue"; +import { Close, FullScreen, Minus } from "@element-plus/icons-vue"; +import { renderNode } from "../../utils/vnode"; +import { isArray, isBoolean } from "lodash-es"; +import { useBrowser } from "../../hooks"; + +export default defineComponent({ + name: "cl-dialog", + + components: { + Close, + FullScreen, + Minus + }, + + props: { + // 是否可见 + modelValue: { + type: Boolean, + default: false + }, + // Extraneous non-props attributes + props: Object, + // 标题 + title: { + type: String, + default: "-" + }, + // 高度 + height: String, + // 宽度 + width: { + type: String, + default: "50%" + }, + // 內间距 + padding: { + type: String, + default: "20px" + }, + // 是否缓存 + keepAlive: Boolean, + // 是否全屏 + fullscreen: Boolean, + // 控制按钮 + controls: { + type: Array, + default: () => ["fullscreen", "close"] + }, + // 隐藏头部元素 + hideHeader: Boolean, + // 关闭前 + beforeClose: Function, + // 是否需要滚动条 + scrollbar: { + type: Boolean, + default: true + }, + // 背景透明 + transparent: Boolean + }, + + emits: ["update:modelValue", "fullscreen-change"], + + setup(props, { emit, expose, slots }) { + const browser = useBrowser(); + + // el-dialog + const Dialog = ref(); + + // 是否全屏 + const fullscreen = ref(false); + + // 是否可见 + const visible = ref(false); + + // 缓存数 + const cacheKey = ref(0); + + // 是否全屏 + const isFullscreen = computed(() => { + return browser && browser.isMini ? true : fullscreen.value; + }); + + // 监听绑定值 + watch( + () => props.modelValue, + (val) => { + visible.value = val; + if (val && !props.keepAlive) { + cacheKey.value += 1; + } + }, + { + immediate: true + } + ); + + // 监听 fullscreen 变化 + watch( + () => props.fullscreen, + (val) => { + fullscreen.value = val; + }, + { + immediate: true + } + ); + + // fullscreen-change 回调 + watch(fullscreen, (val: boolean) => { + emit("fullscreen-change", val); + }); + + // 提供 + provide("dialog", { + visible, + fullscreen: isFullscreen + }); + + // 打开 + function open() { + fullscreen.value = true; + } + + // 关闭 + function close() { + function done() { + onClose(); + } + + if (props.beforeClose) { + props.beforeClose(done); + } else { + done(); + } + } + + // 关闭后 + function onClose() { + emit("update:modelValue", false); + } + + // 切换全屏 + function changeFullscreen(val?: boolean) { + fullscreen.value = isBoolean(val) ? Boolean(val) : !fullscreen.value; + } + + // 双击全屏 + function dblClickFullscreen() { + if (isArray(props.controls) && props.controls.includes("fullscreen")) { + changeFullscreen(); + } + } + + // 渲染头部 + function renderHeader() { + return ( + props.hideHeader || ( +
+ {props.title} + +
+ {props.controls.map((e: any) => { + switch (e) { + //全屏按钮 + case "fullscreen": + if (browser.screen === "xs") { + return null; + } + + // 是否显示全屏按钮 + if (isFullscreen.value) { + return ( + + ); + } else { + return ( + + ); + } + + // 关闭按钮 + case "close": + return ( + + ); + + // 自定义按钮 + default: + return renderNode(e, { + slots + }); + } + })} +
+
+ ) + ); + } + + expose({ + Dialog, + visible, + isFullscreen, + open, + close, + changeFullscreen + }); + + return () => { + return h( + , + {}, + { + header() { + return renderHeader(); + }, + default() { + const height = isFullscreen.value ? "100%" : props.height; + + const style = { + padding: props.padding, + height + }; + + function content() { + return ( +
+ {slots.default?.()} +
+ ); + } + + if (props.scrollbar) { + style.height = "auto"; + + return {content()}; + } else { + return content(); + } + }, + footer() { + const d = slots.footer?.(); + + if (d && d[0]?.shapeFlag) { + return ; + } + + return null; + } + } + ); + }; + } +}); diff --git a/packages/crud/src/components/error-message/index.tsx b/packages/crud/src/components/error-message/index.tsx new file mode 100644 index 0000000..1f17a72 --- /dev/null +++ b/packages/crud/src/components/error-message/index.tsx @@ -0,0 +1,17 @@ +import { defineComponent } from "vue"; + +export default defineComponent({ + name: "cl-error-message", + + props: { + title: String + }, + + setup(props) { + return () => { + return
+ {props.title} +
; + }; + } +}); diff --git a/packages/crud/src/components/filter/index.tsx b/packages/crud/src/components/filter/index.tsx new file mode 100644 index 0000000..851c270 --- /dev/null +++ b/packages/crud/src/components/filter/index.tsx @@ -0,0 +1,23 @@ +import { defineComponent } from "vue"; + +export default defineComponent({ + name: "cl-filter", + + props: { + label: String + }, + + setup(props, { slots }) { + return () => { + return ( +
+ + {props.label} + + + {slots.default?.()} +
+ ); + }; + } +}); diff --git a/packages/crud/src/components/flex1/index.tsx b/packages/crud/src/components/flex1/index.tsx new file mode 100644 index 0000000..b22955f --- /dev/null +++ b/packages/crud/src/components/flex1/index.tsx @@ -0,0 +1,11 @@ +import { defineComponent } from "vue"; + +export default defineComponent({ + name: "cl-flex1", + + setup() { + return () => { + return
; + }; + } +}); diff --git a/packages/crud/src/components/form-card/index.tsx b/packages/crud/src/components/form-card/index.tsx new file mode 100644 index 0000000..b3fdde4 --- /dev/null +++ b/packages/crud/src/components/form-card/index.tsx @@ -0,0 +1,51 @@ +import { defineComponent, ref } from "vue"; +import { ArrowDown, ArrowUp } from "@element-plus/icons-vue"; + +export default defineComponent({ + name: "cl-form-card", + + components: { + ArrowDown, + ArrowUp + }, + + props: { + label: String, + // 展开状态 + expand: { + type: Boolean, + default: true + }, + // 是否能展开、收起 + isExpand: { + type: Boolean, + default: true + } + }, + + setup(props, { slots }) { + const visible = ref(props.expand); + + function toExpand() { + if (props.isExpand) { + visible.value = !visible.value; + } + } + + return () => { + return ( +
+
+ {props.label} + + + + + +
+
{slots.default?.()}
+
+ ); + }; + } +}); diff --git a/packages/crud/src/components/form-tabs/index.tsx b/packages/crud/src/components/form-tabs/index.tsx new file mode 100644 index 0000000..038b19a --- /dev/null +++ b/packages/crud/src/components/form-tabs/index.tsx @@ -0,0 +1,145 @@ +import { + defineComponent, + h, + nextTick, + onMounted, + PropType, + reactive, + ref, + toRaw, + watch +} from "vue"; +import { isEmpty } from "lodash-es"; +import { useRefs, useDialog } from "../../hooks"; + +export default defineComponent({ + name: "cl-form-tabs", + + props: { + modelValue: [String, Number], + labels: { + type: Array, + default: () => [] + }, + justify: { + type: String as PropType< + "start" | "end" | "left" | "right" | "center" | "justify" | "match-parent" + >, + default: "center" + }, + type: { + type: String as PropType<"card" | "default">, + default: "default" + } + }, + + emits: ["update:modelValue", "change"], + + setup(props, { emit, expose }) { + const { refs, setRefs } = useRefs(); + + // 标识 + const active = ref(""); + + // 切换列表 + const list = ref([]); + + // 下划线 + const line = reactive({ + width: "", + offsetLeft: "", + transform: "", + backgroundColor: "" + }); + + function update(val: any) { + if (!val) { + return false; + } + + nextTick(() => { + const index = list.value.findIndex((e) => e.value === val); + const item = refs[`tab-${index}`]; + + if (item) { + // 下划线位置 + line.width = item.offsetWidth + "px"; + line.transform = `translateX(${item.offsetLeft}px)`; + + // 靠左位置 + let left = item.offsetLeft + item.clientWidth / 2 - 414 / 2 + 15; + + if (left < 0) { + left = 0; + } + + // 设置滚动距离 + refs.tabs.scrollLeft = left; + } + }); + + active.value = val; + emit("update:modelValue", val); + } + + // 监听绑定值变化 + watch(() => props.modelValue, update); + + // 监听值修改 + watch( + () => active.value, + (val) => { + emit("change", val); + } + ); + + useDialog({ + onFullscreen() { + update(active.value); + } + }); + + onMounted(function () { + if (!isEmpty(props.labels)) { + list.value = props.labels; + update(isEmpty(props.modelValue) ? list.value[0].value : props.modelValue); + } + }); + + expose({ + active, + list, + line, + update + }); + + return () => { + return ( +
+
+
    + {list.value.map((e, i) => { + return ( +
  • { + update(e.value); + }}> + {e.icon && {h(toRaw(e.icon))}} + {e.label} +
  • + ); + })} + + {line.width &&
    } +
+
+
+ ); + }; + } +}); diff --git a/packages/crud/src/components/form/helper/action.ts b/packages/crud/src/components/form/helper/action.ts new file mode 100644 index 0000000..eaf9674 --- /dev/null +++ b/packages/crud/src/components/form/helper/action.ts @@ -0,0 +1,146 @@ +import { assign } from "lodash-es"; +import { dataset } from "../../../utils"; + +export function useAction({ + config, + form, + Form +}: { + config: ClForm.Config; + form: obj; + Form: Vue.Ref; +}) { + // 设置数据 + function set( + { + prop, + key, + path + }: { prop?: string; key?: "options" | "props" | "hidden" | "hidden-toggle"; path?: string }, + data?: any + ) { + const p: string = path || ""; + + if (path) { + dataset(config, p, data); + } else { + let d: any; + + if (prop) { + function deep(arr: ClForm.Item[]) { + arr.forEach((e) => { + if (e.prop == prop) { + d = e; + } else { + if (e.children) { + deep(e.children); + } + } + }); + } + + deep(config.items); + } + + if (d) { + switch (key) { + case "options": + d.component.options = data; + break; + + case "props": + assign(d.component.props, data); + break; + + case "hidden": + d.hidden = data; + break; + + case "hidden-toggle": + d.hidden = data === undefined ? !d.hidden : !data; + break; + + default: + assign(d, data); + break; + } + } else { + console.error(`[set] ${prop} is not found`); + } + } + } + + // 获取表单值 + function getForm(prop: string) { + return prop ? form[prop] : form; + } + + // 设置表单值 + function setForm(prop: string, value: any) { + form[prop] = value; + } + + // 设置配置 + function setConfig(path: string, value: any) { + set({ path }, value); + } + + // 设置数据 + function setData(prop: string, value: any) { + set({ prop }, value); + } + + // 设置表单项的下拉数据列表 + function setOptions(prop: string, value: any[]) { + set({ prop, key: "options" }, value); + } + + // 设置表单项的组件参数 + function setProps(prop: string, value: any) { + set({ prop, key: "props" }, value); + } + + // 切换表单项的显示、隐藏 + function toggleItem(prop: string, value?: boolean) { + set({ prop, key: "hidden-toggle" }, value); + } + + // 对部分表单项隐藏 + function hideItem(...props: string[]) { + props.forEach((prop) => { + set({ prop, key: "hidden" }, true); + }); + } + + // 对部分表单项显示 + function showItem(...props: string[]) { + props.forEach((prop) => { + set({ prop, key: "hidden" }, false); + }); + } + + // 设置标题 + function setTitle(value: string) { + config.title = value; + } + + // 是否展开表单项 + function collapseItem(e: any) { + Form.value?.clearValidate(e.prop); + e.collapse = !e.collapse; + } + + return { + getForm, + setForm, + setData, + setConfig, + setOptions, + setProps, + toggleItem, + hideItem, + showItem, + setTitle, + collapseItem + }; +} diff --git a/packages/crud/src/components/form/helper/api.ts b/packages/crud/src/components/form/helper/api.ts new file mode 100644 index 0000000..a37190c --- /dev/null +++ b/packages/crud/src/components/form/helper/api.ts @@ -0,0 +1,36 @@ +import { useElApi } from "../../../hooks"; + +export function useApi({ Form }: { Form: Vue.Ref }) { + return useElApi( + [ + "open", + "close", + "clear", + "reset", + "submit", + "bindForm", + "changeTab", + "setTitle", + "showLoading", + "hideLoading", + "collapseItem", + "getForm", + "setForm", + "invokeData", + "setData", + "setConfig", + "setOptions", + "setProps", + "toggleItem", + "hideItem", + "showItem", + "validate", + "validateField", + "resetFields", + "scrollToField", + "clearValidate", + "fields" + ], + Form + ); +} diff --git a/packages/crud/src/components/form/helper/index.ts b/packages/crud/src/components/form/helper/index.ts new file mode 100644 index 0000000..f89d7ad --- /dev/null +++ b/packages/crud/src/components/form/helper/index.ts @@ -0,0 +1,85 @@ +import { reactive, ref, watch } from "vue"; +import { useConfig } from "../../../hooks"; +import { cloneDeep } from "lodash-es"; + +export function useForm() { + const { dict } = useConfig(); + + // 表单配置 + const config = reactive({ + title: "-", + height: undefined, + width: "50%", + props: { + labelWidth: 100 + }, + on: {}, + op: { + hidden: false, + saveButtonText: dict.label.save, + closeButtonText: dict.label.close, + buttons: ["close", "save"] + }, + dialog: { + closeOnClickModal: false, + appendToBody: true + }, + items: [], + form: {}, + _data: {} + }); + + const Form = ref(); + + // 表单数据 + const form = reactive({}); + + // 表单数据备份 + const oldForm = ref({}); + + // 表单是否可见 + const visible = ref(false); + + // 表单提交保存状态 + const saving = ref(false); + + // 表单加载状态 + const loading = ref(false); + + // 表单禁用状态 + const disabled = ref(false); + + // 监听表单变化 + watch( + () => form, + (val) => { + if (config.on?.change) { + for (const i in val) { + if (form[i] !== oldForm.value[i]) { + config.on?.change(val, i); + } + } + } + + oldForm.value = cloneDeep(val); + }, + { + deep: true + } + ); + + return { + Form, + config, + form, + visible, + saving, + loading, + disabled + }; +} + +export * from "./action"; +export * from "./api"; +export * from "./plugins"; +export * from "./tabs"; diff --git a/packages/crud/src/components/form/helper/plugins.ts b/packages/crud/src/components/form/helper/plugins.ts new file mode 100644 index 0000000..f0a37e6 --- /dev/null +++ b/packages/crud/src/components/form/helper/plugins.ts @@ -0,0 +1,92 @@ +import { type Ref, type WatchStopHandle, getCurrentInstance, watch } from "vue"; +import { useConfig } from "../../../hooks"; +import { uniqueFns } from "../../../utils"; + +export function usePlugins(enable: boolean, { visible }: { visible: Ref }) { + const that: any = getCurrentInstance(); + const { style } = useConfig(); + + interface Event { + onOpen: (() => void)[]; + onClose: (() => void)[]; + onSubmit: ((data: obj) => Promise | obj)[]; + [key: string]: any; + } + + // 事件 + const ev: Event = { + onOpen: [], + onClose: [], + onSubmit: [] + }; + + // 监听器 + let timer: WatchStopHandle | null = null; + + // 插件创建 + function create(plugins: ClForm.Plugin[] = []) { + if (!enable) { + return false; + } + + for (const i in ev) { + ev[i] = []; + } + + // 停止监听 + if (timer) { + timer(); + } + + // 执行 + uniqueFns([...(style.form.plugins || []), ...plugins]).forEach((p) => { + const d: any = { + exposed: that.exposed + }; + + for (const i in ev) { + d[i] = (cb: any) => { + ev[i].push(cb); + }; + } + + p(d); + }); + + timer = watch( + visible, + (val) => { + if (val) { + setTimeout(() => { + ev.onOpen.forEach((e) => e()); + }, 10); + } else { + ev.onClose.forEach((e) => e()); + } + }, + { + immediate: true + } + ); + } + + // 表单提交 + async function submit(data: any) { + let d = data; + + for (let i = 0; i < ev.onSubmit.length; i++) { + const d2 = await ev.onSubmit[i](d); + + if (d2) { + d = d2; + } + } + + return d; + } + + return { + create, + submit + }; +} diff --git a/packages/crud/src/components/form/helper/tabs.ts b/packages/crud/src/components/form/helper/tabs.ts new file mode 100644 index 0000000..e067616 --- /dev/null +++ b/packages/crud/src/components/form/helper/tabs.ts @@ -0,0 +1,151 @@ +import { computed, ref } from "vue"; + +export function useTabs({ config, Form }: { config: ClForm.Config; Form: Vue.Ref }) { + // 选中 + const active = ref(); + + // 列表 + const list = computed(() => { + return get()?.props?.labels || []; + }); + + // 获取选项 + function getItem(value: any) { + return list.value.find((e) => e.value == value); + } + + // 是否已加载 + function isLoaded(value: any) { + const d = getItem(value); + return d?.lazy ? d.loaded : true; + } + + // 加载后 + function onLoad(value: any) { + const d = getItem(value); + d!.loaded = true; + } + + // 查找分组 + function toGroup(opts: { config: ClForm.Config; prop: string; refs: any }) { + if (active.value) { + let name; + + // 查找标签上绑定的数据 + const el = opts.refs.form.querySelector(`[data-prop="${opts.prop}"]`); + + // 各自判断 + if (el) { + name = el?.getAttribute("data-group"); + } else { + function deep(d: ClForm.Item) { + if (d.prop == opts.prop) { + name = d.group; + } else { + if (d.children) { + d.children.forEach(deep); + } + } + } + + config.items.forEach(deep); + } + + if (name) { + set(name); + } + } + } + + // 获取参数 + function get() { + return config.items.find((e) => e.type === "tabs"); + } + + // 设置参数 + function set(data: any) { + active.value = data; + } + + // 清空 + function clear() { + // 清空选中 + active.value = undefined; + + // 清空加载状态 + list.value.forEach((e) => { + if (e.lazy && e.loaded) { + e.loaded = undefined; + } + }); + } + + // 切换 + function change(value: any, isValid = true) { + return new Promise((resolve: Function, reject: Function) => { + function next() { + active.value = value; + resolve(); + } + + if (isValid) { + let isError = false; + + const arr = config.items + .filter((e) => e.group == active.value && !e._hidden && e.prop) + .map((e) => { + return new Promise((r: Function) => { + // 验证表单 + Form.value.validateField(e.prop, (valid: string) => { + if (valid) { + isError = true; + } + + r(valid); + }); + }); + }); + + Promise.all(arr).then((msg) => { + if (isError) { + reject(msg.filter(Boolean)); + } else { + next(); + } + }); + } else { + next(); + } + }); + } + + // 合并 + function mergeProp(item: ClForm.Item) { + const d = get(); + + if (d && d.props) { + const { mergeProp, labels = [] } = d.props; + + if (mergeProp) { + const t = labels.find((e) => e.value == item.group); + + if (t && t.name) { + item.prop = `${t.name}-${item.prop}`; + } + } + } + } + + return { + active, + list, + isLoaded, + onLoad, + get, + set, + change, + clear, + mergeProp, + toGroup + }; +} diff --git a/packages/crud/src/components/form/index.tsx b/packages/crud/src/components/form/index.tsx new file mode 100644 index 0000000..c27b4d4 --- /dev/null +++ b/packages/crud/src/components/form/index.tsx @@ -0,0 +1,683 @@ +import { defineComponent, h, nextTick } from "vue"; +import { assign, cloneDeep, isBoolean, isFunction, keys } from "lodash-es"; +import { useAction, useForm, usePlugins, useTabs } from "./helper"; +import { useBrowser, useConfig, useElApi, useRefs } from "../../hooks"; +import { getValue, merge } from "../../utils"; +import formHook from "../../utils/form-hook"; +import { renderNode } from "../../utils/vnode"; + +export default defineComponent({ + name: "cl-form", + + props: { + name: String, + inner: Boolean, + inline: Boolean, + enablePlugin: { + type: Boolean, + default: true + } + }, + + setup(props, { expose, slots }) { + const { refs, setRefs } = useRefs(); + const { style, dict } = useConfig(); + const browser = useBrowser(); + const { Form, config, form, visible, saving, loading, disabled } = useForm(); + + // 关闭的操作类型 + let closeAction: ClForm.CloseAction = "close"; + + // 旧表单数据 + let defForm: obj | undefined; + + // 选项卡 + const Tabs = useTabs({ config, Form }); + + // 操作 + const Action = useAction({ config, form, Form }); + + // 方法 + const ElFormApi = useElApi( + [ + "validate", + "validateField", + "resetFields", + "scrollToField", + "clearValidate", + "fields" + ], + Form + ); + + // 插件 + const plugin = usePlugins(props.enablePlugin, { visible }); + + // 显示加载中 + function showLoading() { + loading.value = true; + } + + // 隐藏加载 + function hideLoading() { + loading.value = false; + } + + // 设置是否禁用 + function setDisabled(val: boolean = true) { + disabled.value = val; + } + + // 请求表单保存状态 + function done() { + saving.value = false; + } + + // 关闭表单 + function close(action?: ClForm.CloseAction) { + if (action) { + closeAction = action; + } + + beforeClose(() => { + visible.value = false; + done(); + }); + } + + // 关闭前 + function beforeClose(done: fn) { + if (config.on?.close) { + config.on.close(closeAction, done); + } else { + done(); + } + } + + // 关闭后 + function onClosed() { + Tabs.clear(); + Form.value?.clearValidate(); + } + + // 清空表单验证 + function clear() { + for (const i in form) { + delete form[i]; + } + + setTimeout(() => { + Form.value?.clearValidate(); + }, 0); + } + + // 重置 + function reset() { + if (defForm) { + for (const i in defForm) { + form[i] = cloneDeep(defForm[i]); + } + } + } + + // 转换表单值,处理多层级等数据 + function invokeData(d: any) { + for (const i in d) { + if (i.includes("-")) { + // 结构参数 + const [a, ...arr] = i.split("-"); + + // 关键值的key + const k: string = arr.pop() || ""; + + if (!d[a]) { + d[a] = {}; + } + + let f: any = d[a]; + + // 设置默认值 + arr.forEach((e) => { + if (!f[e]) { + f[e] = {}; + } + + f = f[e]; + }); + + // 设置关键值 + f[k] = d[i]; + + delete d[i]; + } + } + } + + // 表单提交 + function submit(callback?: fn) { + // 验证表单 + Form.value.validate(async (valid: boolean, error: any) => { + if (valid) { + saving.value = true; + + // 拷贝表单值 + const d = cloneDeep(form); + + config.items.forEach((e) => { + function deep(e: ClForm.Item) { + if (e.prop) { + // 过滤隐藏的表单项 + if (e._hidden) { + if (e.prop) { + delete d[e.prop]; + } + } + + // hook 提交处理 + if (e.hook) { + formHook.submit({ + ...e, + value: e.prop ? d[e.prop] : undefined, + form: d + }); + } + } + + if (e.children) { + e.children.forEach(deep); + } + } + + deep(e); + }); + + // 处理数据 + invokeData(d); + + const submit = callback || config.on?.submit; + + // 提交事件 + if (submit) { + submit(await plugin.submit(d), { + close() { + close("save"); + }, + done + }); + } else { + done(); + } + } else { + // 切换到对应的选项卡 + Tabs.toGroup({ + refs, + config, + prop: keys(error)[0] + }); + } + }); + } + + // 打开表单 + function open(options?: ClForm.Options, plugins?: ClForm.Plugin[]) { + if (!options) { + return console.error("Options is not null"); + } + + // 清空 + if (options.isReset !== false) { + clear(); + } + + // 显示对话框 + visible.value = true; + + // 默认关闭方式 + closeAction = "close"; + + // 合并配置 + for (const i in config) { + switch (i) { + // 表单项 + case "items": + function deep(arr: any[]): any[] { + return arr.map((e) => { + const d = getValue(e); + + return { + ...d, + children: d?.children ? deep(d.children) : undefined + }; + }); + } + + config.items = deep(options.items || []); + break; + // 事件、参数、操作 + case "on": + case "op": + case "props": + case "dialog": + case "_data": + merge(config[i], options[i] || {}); + break; + // 其他 + default: + config[i] = options[i]; + break; + } + } + + // 预设表单值 + if (options?.form) { + for (const i in options.form) { + form[i] = options.form[i]; + } + } + + // 设置表单数据 + config.items.forEach((e) => { + function deep(e: ClForm.Item) { + if (e.prop) { + // 解析 prop + if (e.prop.includes(".")) { + e.prop = e.prop.replace(/\./g, "-"); + } + + // prop 合并 + Tabs.mergeProp(e); + + // hook 绑定值 + formHook.bind({ + ...e, + value: form[e.prop] !== undefined ? form[e.prop] : cloneDeep(e.value), + form + }); + + // 表单验证 + if (e.required) { + e.rules = { + required: true, + message: dict.label.nonEmpty.replace("{label}", e.label || "") + }; + } + } + + // 设置 tabs 默认值 + if (e.type == "tabs") { + Tabs.set(e.value); + } + + // 子集 + if (e.children) { + e.children.forEach(deep); + } + } + + deep(e); + }); + + // 设置默认值 + if (!defForm) { + defForm = cloneDeep(form); + } + + // 创建插件 + plugin.create(plugins); + + // 打开回调 + nextTick(() => { + setTimeout(() => { + // 打开事件 + if (config.on?.open) { + config.on.open(form); + } + }, 10); + }); + } + + // 绑定表单数据 + function bindForm(data: any) { + config.items.forEach((e) => { + function deep(e: ClForm.Item) { + formHook.bind({ + ...e, + value: e.prop ? data[e.prop] : undefined, + form: data + }); + + if (e.children) { + e.children.forEach(deep); + } + } + + deep(e); + }); + + assign(form, data); + } + + // 渲染表单项 + function renderFormItem(e: ClForm.Item) { + const { isDisabled } = config._data; + + if (e.type == "tabs") { + return ( + + ); + } + + // 是否隐藏 + e._hidden = parseHidden(e.hidden, { + scope: form + }); + + // 分组显示 + const inGroup = e.group ? e.group === Tabs.active.value : true; + + // 是否已加载完成 + const isLoaded = e.component && Tabs.isLoaded(e.group); + + // 表单项 + const FormItem = h( + , + e.props, + { + label() { + if (e.renderLabel) { + return renderNode(e.renderLabel, { + scope: form, + render: "slot", + slots + }); + } else { + return e.label; + } + }, + default() { + return ( +
+
+ {["prepend", "component", "append"] + .filter((k) => e[k]) + .map((name) => { + const children = e.children && ( +
+ + {e.children.map(renderFormItem)} + +
+ ); + + const Item = renderNode(e[name], { + item: e, + prop: e.prop, + scope: form, + slots, + children, + _data: { + isDisabled + } + }); + + return ( +
+ {Item} +
+ ); + })} +
+ + {isBoolean(e.collapse) && ( +
{ + Action.collapseItem(e); + }}> + + {e.collapse + ? dict.label.seeMore + : dict.label.hideContent} + +
+ )} +
+ ); + } + } + ); + + let span = e.span || style.form.span; + + if (browser.isMini) { + span = 24; + } + + // 是否行内 + const Item = props.inline ? ( + FormItem + ) : ( + + {FormItem} + + ); + + return isLoaded ? Item : null; + } + + // 渲染表单 + function renderContainer() { + // 表单项列表 + const children = config.items.map(renderFormItem); + + // 表单标签位置 + const labelPosition = + browser.isMini && !props.inline + ? "top" + : config.props.labelPosition || style.form.labelPosition; + + return ( +
+ {h( + { + submit(); + e.preventDefault(); + }} + />, + { + ...config.props, + labelPosition + }, + { + default: () => { + const items = [ + slots.prepend && slots.prepend({ scope: form }), + children, + slots.append && slots.append({ scope: form }) + ]; + + return ( +
+ {props.inline ? ( + items + ) : ( + {items} + )} +
+ ); + } + } + )} +
+ ); + } + + // 渲染表单底部按钮 + function renderFooter() { + const { hidden, buttons, saveButtonText, closeButtonText, justify } = config.op; + + if (hidden) { + return null; + } + + const Btns = buttons?.map((e: any) => { + switch (e) { + case "save": + return ( + { + submit(); + }}> + {saveButtonText} + + ); + case "close": + return ( + { + close("close"); + }}> + {closeButtonText} + + ); + default: + return renderNode(e, { + scope: form, + slots, + custom() { + return ( + { + e.onClick({ scope: form }); + }}> + {e.label} + + ); + } + }); + } + }); + + return ( + + ); + } + + // Tools + function parseHidden(value: any, { scope }: any) { + if (isBoolean(value)) { + return value; + } else if (isFunction(value)) { + return value({ scope }); + } + + return false; + } + + const ctx = { + name: props.name, + refs, + Form, + visible, + saving, + form, + config, + loading, + disabled, + open, + close, + done, + clear, + reset, + submit, + invokeData, + bindForm, + showLoading, + hideLoading, + setDisabled, + Tabs, + ...Action, + ...ElFormApi + }; + + expose(ctx); + + return () => { + if (props.inner) { + return ( + visible.value && ( +
+ {renderContainer()} + {renderFooter()} +
+ ) + ); + } else { + return h( + , + { + title: config.title, + height: config.height, + width: config.width, + ...config.dialog, + beforeClose, + onClosed, + keepAlive: false + }, + { + default() { + return renderContainer(); + }, + footer() { + return renderFooter(); + } + } + ); + } + }; + } +}); diff --git a/packages/crud/src/components/index.tsx b/packages/crud/src/components/index.tsx new file mode 100644 index 0000000..b23c344 --- /dev/null +++ b/packages/crud/src/components/index.tsx @@ -0,0 +1,50 @@ +import { App } from "vue"; +import Crud from "./crud"; +import AddBtn from "./add-btn"; +import AdvBtn from "./adv/btn"; +import AdvSearch from "./adv/search"; +import Flex from "./flex1"; +import Form from "./form"; +import FormTabs from "./form-tabs"; +import FormCard from "./form-card"; +import MultiDeleteBtn from "./multi-delete-btn"; +import Pagination from "./pagination"; +import RefreshBtn from "./refresh-btn"; +import SearchKey from "./search-key"; +import Table from "./table"; +import Upsert from "./upsert"; +import Dialog from "./dialog"; +import Filter from "./filter"; +import Search from "./search"; +import ErrorMessage from "./error-message"; +import Row from "./row"; +import ContextMenu from "./context-menu"; + +export const components: { [key: string]: any } = { + Crud, + AddBtn, + AdvBtn, + AdvSearch, + Flex, + Form, + FormTabs, + FormCard, + MultiDeleteBtn, + Pagination, + RefreshBtn, + SearchKey, + Table, + Upsert, + Dialog, + Filter, + Search, + ErrorMessage, + Row, + ContextMenu +}; + +export function useComponent(app: App) { + for (const i in components) { + app.component(components[i].name, components[i]); + } +} diff --git a/packages/crud/src/components/multi-delete-btn/index.tsx b/packages/crud/src/components/multi-delete-btn/index.tsx new file mode 100644 index 0000000..a1d9433 --- /dev/null +++ b/packages/crud/src/components/multi-delete-btn/index.tsx @@ -0,0 +1,27 @@ +import { defineComponent } from "vue"; +import { useConfig, useCore } from "../../hooks"; + +export default defineComponent({ + name: "cl-multi-delete-btn", + + setup(_, { slots }) { + const { crud } = useCore(); + const { style } = useConfig(); + + return () => { + return ( + crud.getPermission("delete") && ( + { + crud.rowDelete(...crud.selection); + }}> + {slots.default?.() || crud.dict.label.multiDelete} + + ) + ); + }; + } +}); diff --git a/packages/crud/src/components/pagination/index.tsx b/packages/crud/src/components/pagination/index.tsx new file mode 100644 index 0000000..adc358c --- /dev/null +++ b/packages/crud/src/components/pagination/index.tsx @@ -0,0 +1,90 @@ +import { defineComponent, h, onMounted, onUnmounted, ref } from "vue"; +import { useBrowser, useConfig, useCore } from "../../hooks"; + +export default defineComponent({ + name: "cl-pagination", + + setup(_, { expose }) { + const { crud, mitt } = useCore(); + const { style } = useConfig(); + const browser = useBrowser(); + + // 总数 + const total = ref(0); + + // 当前页数 + const currentPage = ref(1); + + // 每页大小 + const pageSize = ref(20); + + // 页数发生变化 + function onCurrentChange(index: number) { + crud.refresh({ + page: index + }); + } + + // 条目发生变化 + function onSizeChange(size: number) { + crud.refresh({ + page: 1, + size + }); + } + + // 设置分页信息 + function setPagination(res: obj) { + if (res) { + currentPage.value = res.currentPage || res.page || 1; + pageSize.value = res.pageSize || res.size || 20; + total.value = res.total || 0; + crud.params.size = pageSize.value; + } + } + + // 数据刷新 + function onRefresh(res: ClCrud.Response["page"]) { + setPagination(res.pagination); + } + + // 监听刷新事件 + onMounted(() => { + mitt.on("crud.refresh", onRefresh); + }); + + // 移除监听事件 + onUnmounted(() => { + mitt.off("crud.refresh", onRefresh); + }); + + expose({ + total, + currentPage, + pageSize, + setPagination + }); + + return () => { + return h( + , + { + onSizeChange, + onCurrentChange, + total: total.value, + currentPage: currentPage.value, + pageSize: pageSize.value + } + ); + }; + } +}); diff --git a/packages/crud/src/components/refresh-btn/index.tsx b/packages/crud/src/components/refresh-btn/index.tsx new file mode 100644 index 0000000..df8b8cd --- /dev/null +++ b/packages/crud/src/components/refresh-btn/index.tsx @@ -0,0 +1,23 @@ +import { defineComponent } from "vue"; +import { useConfig, useCore } from "../../hooks"; + +export default defineComponent({ + name: "cl-refresh-btn", + + setup(_, { slots }) { + const { crud } = useCore(); + const { style } = useConfig(); + + return () => { + return ( + { + crud.refresh(); + }}> + {slots.default?.() || crud.dict.label.refresh} + + ); + }; + } +}); diff --git a/packages/crud/src/components/row/index.tsx b/packages/crud/src/components/row/index.tsx new file mode 100644 index 0000000..4ea69c6 --- /dev/null +++ b/packages/crud/src/components/row/index.tsx @@ -0,0 +1,11 @@ +import { defineComponent } from "vue"; + +export default defineComponent({ + name: "cl-row", + + setup(_, { slots }) { + return () => { + return {slots.default && slots.default()}; + }; + } +}); diff --git a/packages/crud/src/components/search-key/index.tsx b/packages/crud/src/components/search-key/index.tsx new file mode 100644 index 0000000..e213424 --- /dev/null +++ b/packages/crud/src/components/search-key/index.tsx @@ -0,0 +1,178 @@ +import { defineComponent, ref, computed, type PropType, useModel } from "vue"; +import { useConfig, useCore } from "../../hooks"; +import { parsePx } from "../../utils"; +import { debounce } from "lodash-es"; + +export default defineComponent({ + name: "cl-search-key", + + props: { + // 绑定值 + modelValue: String, + // 选中字段 + field: { + type: String, + default: "keyWord" + }, + // 字段列表 + fieldList: { + type: Array as PropType>, + default: () => [] + }, + // 搜索时的钩子 + onSearch: Function, + // 输入框占位内容 + placeholder: String, + // 宽度 + width: { + type: [String, Number], + default: 280 + }, + // 是否实时刷新 + refreshOnInput: Boolean + }, + + emits: ["update:modelValue", "change", "field-change"], + + setup(props, { emit, expose }) { + const { crud } = useCore(); + const { style } = useConfig(); + + // 选中字段 + const selectField = ref(props.field); + + // 加载状态 + const loading = ref(false); + + // 文字提示 + const placeholder = computed(() => { + if (props.placeholder) { + return props.placeholder; + } else { + const item = props.fieldList.find((e) => e.value == selectField.value); + + if (item) { + return crud.dict.label.placeholder + item.label; + } else { + return crud.dict.label.searchKey; + } + } + }); + + // 搜索内容 + const value = useModel(props, "modelValue"); + + // 锁 + let lock = false; + + // 搜索 + function search() { + if (!lock) { + const params: obj = {}; + + props.fieldList.forEach((e) => { + params[e.value] = undefined; + }); + + async function next(newParams?: obj) { + loading.value = true; + + await crud.refresh({ + page: 1, + ...params, + [selectField.value]: value.value || undefined, + ...newParams + }) + .catch(err => { + console.error(err); + }) + + loading.value = false; + } + + if (props.onSearch) { + props.onSearch(params, { next }); + } else { + next(); + } + } + } + + // 回车搜索 + function onKeydown({ key }: KeyboardEvent) { + if (key === "Enter") { + search(); + } + } + + // 监听变化 + function onChange(val: string) { + if (!props.refreshOnInput) { + search(); + lock = true; + + setTimeout(() => { + lock = false; + }, 300); + + emit("change", val); + } + } + + // 监听输入 + const onInput = debounce((val: string) => { + emit("change", val); + + if (props.refreshOnInput) { + search(); + } + }, 300); + + // 监听字段选择 + function onFieldChange() { + emit("field-change", selectField.value); + value.value = undefined; + } + + expose({ + search + }); + + return () => { + return ( +
+ 0} + onChange={onFieldChange}> + {props.fieldList.map((e, i) => ( + + ))} + + +
+ + + + {crud.dict.label.search} + +
+
+ ); + }; + } +}); diff --git a/packages/crud/src/components/search/helper/plugins.ts b/packages/crud/src/components/search/helper/plugins.ts new file mode 100644 index 0000000..05628e6 --- /dev/null +++ b/packages/crud/src/components/search/helper/plugins.ts @@ -0,0 +1,21 @@ +import { getCurrentInstance } from "vue"; +import { useConfig } from "../../../hooks"; +import { uniqueFns } from "../../../utils"; + +export function usePlugins() { + const that: any = getCurrentInstance(); + const { style } = useConfig(); + + // 插件创建 + function create(plugins: ClSearch.Plugin[] = []) { + uniqueFns([...(style.search?.plugins || []), ...plugins]).forEach((p) => { + p({ + exposed: that.exposed + }); + }); + } + + return { + create + }; +} diff --git a/packages/crud/src/components/search/index.tsx b/packages/crud/src/components/search/index.tsx new file mode 100644 index 0000000..305413f --- /dev/null +++ b/packages/crud/src/components/search/index.tsx @@ -0,0 +1,298 @@ +import { useConfig, useCore, useForm, useProxy, useRefs } from "../../hooks"; +import { + onMounted, + PropType, + defineComponent, + ref, + h, + reactive, + inject, + mergeProps, + nextTick, + onUnmounted +} from "vue"; +import { useApi } from "../form/helper"; +import { Search, Refresh, Bottom, Top } from "@element-plus/icons-vue"; +import { mitt } from "../../utils/mitt"; +import { isArray, isEmpty } from "lodash-es"; +import { usePlugins } from "./helper/plugins"; + +export default defineComponent({ + name: "cl-search", + + props: { + // 是否行内 + inline: { + type: Boolean, + default: true + }, + + // cl-form 表单配置 + props: { + type: Object, + default: () => ({}) + }, + + // 表单值 + data: { + type: Object, + default: () => ({}) + }, + + // 列 + items: { + type: Array as PropType, + default: () => [] + }, + + // 是否需要重置按钮 + resetBtn: { + type: Boolean, + default: false + }, + + // 是否需要折叠 + collapse: { + type: Boolean, + default: false + }, + + // 初始化 + onLoad: Function, + + // 搜索时钩子 + onSearch: Function + }, + + emits: ["reset"], + + setup(props, { slots, expose, emit }) { + const { crud } = useCore(); + const { refs, setRefs } = useRefs() + const { style } = useConfig(); + const plugin = usePlugins() + + // 配置 + const config = reactive( + mergeProps(props, inject("useSearch__options") || {}) + ); + + // cl-form + const Form = useForm(); + + // 加载中 + const loading = ref(false); + + // 展开 + const isExpand = ref(!config.collapse); + + // 显示展开、收起按钮 + const showExpandBtn = ref(false); + + // 搜索 + function search(params?: any) { + const form = Form.value?.getForm(); + + async function next(data?: any) { + loading.value = true; + + const d = { + page: 1, + ...form, + ...data, + ...params + }; + + for (const i in d) { + if (d[i] === "") { + d[i] = undefined; + } + } + + const res = await crud.refresh(d); + + loading.value = false; + + return res; + } + + if (config.onSearch) { + config.onSearch(form, { next }); + } else { + next(); + } + } + + // 重置 + function reset() { + const d: any = {}; + + config.items?.map((e) => { + if (typeof e.hook != 'string' && e.hook?.reset) { + const props = e.hook.reset(e.prop!) + + if (isArray(props)) { + props.forEach((prop) => { + d[prop] = undefined; + }) + } + } + + d[e.prop!] = undefined; + }); + + // 重置表单 + Form.value?.reset(); + + // 列表刷新 + search(d); + + // 重置事件 + emit("reset", d); + } + + // 收起、展开 + function expand() { + isExpand.value = !isExpand.value; + + nextTick(() => { + crud?.["cl-table"].calcMaxHeight() + }) + } + + // 判断展开状态 + function onExpand() { + if (config.collapse) { + const el = refs.form?.querySelector(".cl-form__items"); + + if (el) { + showExpandBtn.value = el.clientHeight > 84; + } + } + } + + function onResize() { + onExpand(); + } + + const ctx = { + search, + reset, + Form, + config, + ...useApi({ Form }) + }; + + useProxy(ctx); + expose(ctx); + plugin.create(config.plugins); + + onMounted(() => { + Form.value?.open({ + op: { + hidden: true + }, + props: { + labelPosition: 'right', + ...config.props + }, + items: config.items?.map(e => { + return { + col: { + sm: 12, + md: 8, + xs: 24, + lg: 6, + }, + ...e, + } + }), + form: config.data, + on: { + open(data) { + config.onLoad?.(data); + onExpand(); + }, + change(data, prop) { + config.onChange?.(data, prop); + } + } + }); + + mitt.on("resize", onResize); + }); + + onUnmounted(() => { + mitt.off("resize", onResize); + }) + + return () => { + const btnEl = ( + + {/* 重置按钮 */} + {config.resetBtn && ( + + {crud.dict.label.reset} + + )} + + {/* 搜索按钮 */} + { + search(); + }}> + {crud.dict.label.search} + + + {/* 自定义按钮 */} + {slots?.buttons?.(Form.value?.form)} + + ); + + return ( +
+
+ {h( + , + {}, + { + append() { + return config.collapse ? null : (isEmpty(config.items) || btnEl); + }, + ...slots + } + )} +
+ + {config.collapse && ( +
+ {showExpandBtn.value && ( + + {isExpand.value ? crud.dict.label.collapse : crud.dict.label.expand} + {isExpand.value ? : } + + )} + + + + {btnEl} +
+ )} +
+ ); + }; + } +}); diff --git a/packages/crud/src/components/table/helper/data.ts b/packages/crud/src/components/table/helper/data.ts new file mode 100644 index 0000000..53ac4a8 --- /dev/null +++ b/packages/crud/src/components/table/helper/data.ts @@ -0,0 +1,35 @@ +import { nextTick, ref } from "vue"; +import { useCore } from "../../../hooks"; + +export function useData({ config, Table }: { config: ClTable.Config; Table: Vue.Ref }) { + const { mitt, crud } = useCore(); + + // 列表数据 + const data = ref([]); + + // 设置数据 + function setData(list: obj[]) { + data.value = list; + } + + // 监听刷新 + mitt.on("crud.refresh", ({ list }: ClCrud.Response["page"]) => { + data.value = list; + + // 显示选中行 + nextTick(() => { + crud.selection.forEach((e) => { + const d = list.find((a) => a[config.rowKey] == e[config.rowKey]); + + if (d) { + Table.value.toggleRowSelection(d, true); + } + }); + }); + }); + + return { + data, + setData + }; +} diff --git a/packages/crud/src/components/table/helper/header.tsx b/packages/crud/src/components/table/helper/header.tsx new file mode 100644 index 0000000..3f20a14 --- /dev/null +++ b/packages/crud/src/components/table/helper/header.tsx @@ -0,0 +1,91 @@ +import { CloseBold, Search } from "@element-plus/icons-vue"; +import { h } from "vue"; +import { useCrud } from "../../../hooks"; +import { renderNode } from "../../../utils/vnode"; + +export function renderHeader(item: ClTable.Column, { scope, slots }: any) { + const crud = useCrud(); + + const slot = slots[`header-${item.prop}`]; + + if (slot) { + return slot({ + scope + }); + } + + if (!item.search || !item.search.component) { + return item.label; + } + + // 显示输入框 + function show(e: MouseEvent) { + item.search.isInput = true; + e.stopPropagation(); + } + + // 隐藏输入框 + function hide() { + if (item.search.value !== undefined) { + item.search.value = undefined; + refresh(); + } + + item.search.isInput = false; + } + + // 刷新 + function refresh(params?: any) { + const { value } = item.search; + + crud.value?.refresh({ + page: 1, + [item.prop]: value === "" ? undefined : value, + ...params + }); + } + + // 文字 + const text = ( +
+ {item.search.icon?.() ?? } + + {item.renderLabel ? item.renderLabel(scope) : item.label} +
+ ); + + // 输入框 + const input = h(renderNode(item.search.component, { prop: item.prop }), { + clearable: true, + modelValue: item.search.value, + onVnodeMounted(vn) { + // 默认聚焦 + vn.component?.exposed?.focus?.(); + }, + onInput(val: any) { + item.search.value = val; + }, + onChange(val: any) { + item.search.value = val; + + // 更改时刷新列表 + if (item.search.refreshOnChange) { + refresh(); + } + } + }); + + return ( +
+
{item.search.isInput ? input : text}
+ + {item.search.isInput && ( +
+ + + +
+ )} +
+ ); +} diff --git a/packages/crud/src/components/table/helper/height.ts b/packages/crud/src/components/table/helper/height.ts new file mode 100644 index 0000000..76f0586 --- /dev/null +++ b/packages/crud/src/components/table/helper/height.ts @@ -0,0 +1,99 @@ +import { debounce, last } from "lodash-es"; +import { nextTick, onActivated, onMounted, ref } from "vue"; +import { addClass, removeClass } from "../../../utils"; +import { mitt } from "../../../utils/mitt"; + +// 表格高度 +export function useHeight({ config, Table }: { Table: Vue.Ref; config: ClTable.Config }) { + // 最大高度 + const maxHeight = ref(0); + + // 计算表格最大高度 + const update = debounce(async () => { + await nextTick(); + + let vm = Table.value; + + if (vm) { + while (!vm.$parent?.$el.className?.includes("cl-crud")) { + vm = vm.$parent; + } + + if (vm) { + const p = vm.$parent.$el; + + await nextTick(); + + // 高度 + let h = 0; + + // 表格下间距 + if (vm.$el.className.includes("cl-row")) { + h += 10; + } + + // 上高度 + h += vm.$el.offsetTop; + + // 获取下高度 + let n = vm.$el.nextSibling; + + // 集合 + const arr = [vm.$el]; + + while (n) { + if (n.offsetHeight > 0) { + h += n.offsetHeight || 0; + arr.push(n); + + if (n.className.includes("cl-row--last")) { + h += 10; + } + } + + n = n.nextSibling; + } + + // 移除 cl-row--last + arr.forEach((e) => { + removeClass(e, "cl-row--last"); + }); + + // 最后一个可视元素 + const z = last(arr); + + // 去掉 cl-row 下间距高度 + if (z?.className.includes("cl-row")) { + addClass(z, "cl-row--last"); + h -= 10; + } + + // 上间距 + h += parseInt(window.getComputedStyle(p).paddingTop, 10); + + // 设置最大高度 + if (config.autoHeight) { + maxHeight.value = p.clientHeight - h; + } + } + } + }, 100); + + // 窗口大小改变事件 + mitt.on("resize", () => { + update(); + }); + + onMounted(function () { + update(); + }); + + onActivated(function () { + update(); + }); + + return { + maxHeight, + calcMaxHeight: update + }; +} diff --git a/packages/crud/src/components/table/helper/index.ts b/packages/crud/src/components/table/helper/index.ts new file mode 100644 index 0000000..27f6f7d --- /dev/null +++ b/packages/crud/src/components/table/helper/index.ts @@ -0,0 +1,43 @@ +import { inject, reactive, ref } from "vue"; +import { useConfig } from "../../../hooks"; +import { getValue, mergeConfig } from "../../../utils"; +import type { TableInstance } from "element-plus"; + +export function useTable(props: any) { + const { style } = useConfig(); + + const Table = ref(); + + // 配置 + const config = reactive(mergeConfig(props, inject("useTable__options") || {})); + + // 列表项动态处理 + config.columns = (config.columns || []).map((e) => getValue(e)); + + // 自动高度 + config.autoHeight = config.autoHeight ?? style.table.autoHeight; + + // 右键菜单 + config.contextMenu = config.contextMenu ?? style.table.contextMenu; + + // 事件 + if (!config.on) { + config.on = {}; + } + + // 参数 + if (!config.props) { + config.props = {}; + } + + return { Table, config }; +} + +export * from "./data"; +export * from "./height"; +export * from "./op"; +export * from "./render"; +export * from "./row"; +export * from "./selection"; +export * from "./sort"; +export * from "./header"; diff --git a/packages/crud/src/components/table/helper/op.ts b/packages/crud/src/components/table/helper/op.ts new file mode 100644 index 0000000..556be31 --- /dev/null +++ b/packages/crud/src/components/table/helper/op.ts @@ -0,0 +1,69 @@ +import { nextTick, ref } from "vue"; +import { useCore } from "../../../hooks"; +import { isArray, isBoolean } from "lodash-es"; + +export function useOp({ config }: { config: ClTable.Config }) { + const { mitt } = useCore(); + + // 是否可见,用于解决一些显示隐藏的副作用 + const visible = ref(true); + + // 重新构建 + async function reBuild(cb?: fn) { + visible.value = false; + + await nextTick(); + + if (cb) { + cb(); + } + + visible.value = true; + + await nextTick(); + + mitt.emit("resize"); + } + + // 显示列 + function showColumn(prop: string | string[], status?: boolean) { + const keys = isArray(prop) ? prop : [prop]; + + // 多级表头 + function deep(list: ClTable.Column[]) { + list.forEach((e) => { + if (e.prop && keys.includes(e.prop)) { + e.hidden = isBoolean(status) ? !status : false; + } + + if (e.children) { + deep(e.children); + } + }); + } + + deep(config.columns); + } + + // 隐藏列 + function hideColumn(prop: string | string[]) { + showColumn(prop, false); + } + + // 设置列 + function setColumns(list: ClTable.Column[]) { + if (list) { + reBuild(() => { + config.columns.splice(0, config.columns.length, ...list); + }); + } + } + + return { + visible, + reBuild, + showColumn, + hideColumn, + setColumns + }; +} diff --git a/packages/crud/src/components/table/helper/plugins.ts b/packages/crud/src/components/table/helper/plugins.ts new file mode 100644 index 0000000..4d47605 --- /dev/null +++ b/packages/crud/src/components/table/helper/plugins.ts @@ -0,0 +1,22 @@ +import { getCurrentInstance } from "vue"; +import { useConfig } from "../../../hooks"; +import { uniqueFns } from "../../../utils"; + +export function usePlugins() { + const that: any = getCurrentInstance(); + const { style } = useConfig(); + + // 插件创建 + function create(plugins: ClTable.Plugin[] = []) { + // 执行 + uniqueFns([...(style.table.plugins || []), ...plugins]).forEach((p) => { + p({ + exposed: that.exposed + }); + }); + } + + return { + create + }; +} diff --git a/packages/crud/src/components/table/helper/render.tsx b/packages/crud/src/components/table/helper/render.tsx new file mode 100644 index 0000000..b57df76 --- /dev/null +++ b/packages/crud/src/components/table/helper/render.tsx @@ -0,0 +1,327 @@ +import { h, useSlots } from "vue"; +import { useCore, useBrowser, useConfig } from "../../../hooks"; +import { assign, cloneDeep, isArray, isEmpty, isObject, isString, orderBy } from "lodash-es"; +import { deepFind, getValue } from "../../../utils"; +import { renderNode } from "../../../utils/vnode"; +import { renderHeader } from "./header"; + +// 渲染 +export function useRender() { + const browser = useBrowser(); + const slots = useSlots(); + const { crud } = useCore(); + const { style } = useConfig(); + + // 渲染列 + function renderColumn(columns: ClTable.Column[]) { + const arr = columns.map((e) => { + const d = getValue(e); + + if (!d.orderNum) { + d.orderNum = 0; + } + + return d; + }); + + return orderBy(arr, "orderNum", "asc") + .map((item, index) => { + if (item.hidden) { + return null; + } + + const ElTableColumn = ( + + ); + + // 操作按钮 + if (item.type === "op") { + const props = assign( + { + label: crud.dict.label.op, + width: style.table.column.opWidth, + fixed: browser.isMini ? null : "right" + }, + item + ); + + return h(ElTableColumn, props, { + default: (scope: any) => { + return ( +
+ {renderOpButtons(item.buttons, { scope })} +
+ ); + } + }); + } + // 多选,序号 + else if (["selection", "index"].includes(item.type)) { + return h(ElTableColumn, item); + } + // 默认 + else { + function deep(item: ClTable.Column) { + if (item.hidden) { + return null; + } + + const props: obj = cloneDeep(item); + + // Cannot set property children of # + delete props.children; + + return h(ElTableColumn, props, { + header(scope: any) { + return renderHeader(item, { scope, slots }); + }, + default(scope: any) { + if (item.children) { + return item.children.map(deep); + } + + // 使用插槽 + const slot = slots[`column-${item.prop}`]; + + if (slot) { + return slot({ + scope, + item + }); + } else { + // 绑定值 + let value = scope.row[item.prop]; + + // 格式化 + if (item.formatter) { + value = item.formatter( + scope.row, + scope.column, + value, + scope.$index + ); + + if (isObject(value)) { + return value; + } + } + + // 自定义渲染 + if (item.render) { + return item.render( + scope.row, + scope.column, + value, + scope.$index + ); + } + // 自定义渲染2 + else if (item.component) { + return renderNode(item.component, { + prop: item.prop, + scope: scope.row, + _data: { + column: scope.column, + index: scope.$index, + row: scope.row + } + }); + } + // 字典状态 + else if (item.dict) { + return renderDict(value, item); + } + // 空数据 + else if (isEmpty(value)) { + return scope.emptyText; + } else { + return value; + } + } + } + }); + } + + return deep(item); + } + }) + .filter(Boolean); + } + + // 渲染操作按钮 + function renderOpButtons(buttons: any, { scope }: any) { + const list = getValue(buttons || ["edit", "delete"], { scope }) as ClTable.OpButton; + + return list.map((vnode) => { + if (vnode === "info") { + return ( + { + crud.rowInfo(scope.row); + e.stopPropagation(); + }}> + {crud.dict.label?.info} + + ); + } else if (vnode === "edit") { + return ( + { + crud.rowEdit(scope.row); + e.stopPropagation(); + }}> + {crud.dict.label?.update} + + ); + } else if (vnode === "delete") { + return ( + { + crud.rowDelete(scope.row); + e.stopPropagation(); + }}> + {crud.dict.label?.delete} + + ); + } else { + if (typeof vnode === "object") { + if (vnode.hidden) { + return null; + } + } + + return renderNode(vnode, { + scope, + slots, + custom(vnode) { + return ( + { + vnode.onClick({ scope }); + e.stopPropagation(); + }}> + {vnode.label} + + ); + } + }); + } + }); + } + + // 渲染字典 + function renderDict(value: any, item: ClTable.Column) { + // 选项列表 + const list = cloneDeep(item.dict || []) as DictOptions; + + // 字符串分隔符 + const separator = item.dictSeparator === undefined ? "," : item.dictSeparator; + + // 设置颜色 + if (item.dictColor) { + list.forEach((e, i) => { + if (!e.color) { + e.color = style.colors[i]; + } + }); + } + + // 绑定值 + let values: any[] = []; + + // 格式化值 + if (isArray(value)) { + values = value; + } else if (isString(value)) { + if (separator) { + values = value.split(separator); + } else { + values = [value]; + } + } else { + values = [value]; + } + + // 返回值 + const result = values + .filter((e) => e !== undefined && e !== null && e !== "") + .map((v) => { + const d = deepFind(v, list, { allLevels: item.dictAllLevels }) || { + label: v, + value: v + }; + + return { + ...d, + children: [] + }; + }); + + // 格式化返回 + if (item.dictFormatter) { + return item.dictFormatter(result); + } else { + // tag 返回 + return result.map((e) => { + return h( + , + { + type: e.type, + closable: e.closable, + hit: e.hit, + color: e.color, + size: e.size, + effect: e.effect || "dark", + round: e.round + }, + { + default: () => {e.label} + } + ); + }); + } + } + + // 插槽 empty + function renderEmpty(emptyText: string) { + return ( +
+ {slots.empty ? ( + slots.empty() + ) : ( + + )} +
+ ); + } + + // 插槽 append + function renderAppend() { + return
{slots.append && slots.append()}
; + } + + return { + renderColumn, + renderEmpty, + renderAppend + }; +} diff --git a/packages/crud/src/components/table/helper/row.ts b/packages/crud/src/components/table/helper/row.ts new file mode 100644 index 0000000..80b7620 --- /dev/null +++ b/packages/crud/src/components/table/helper/row.ts @@ -0,0 +1,130 @@ +import { isEmpty, isFunction } from "lodash-es"; +import { useCore } from "../../../hooks"; +import { ContextMenu } from "../../context-menu"; + +// 单元行事件 +export function useRow({ + Table, + config, + Sort +}: { + Table: Vue.Ref; + config: ClTable.Config; + Sort: { + defaultSort: { + prop?: string; + order?: string; + }; + changeSort(prop: string, order: string): void; + }; +}) { + const { crud } = useCore(); + + // 右键菜单 + function onRowContextMenu(row: obj, column: obj, event: PointerEvent) { + // 菜单按钮 + const buttons = config.contextMenu; + // 是否开启 + const enable = !isEmpty(buttons); + + if (enable) { + // 高亮 + Table.value.setCurrentRow(row); + + // 解析按钮 + const list = buttons + .map((e) => { + switch (e) { + case "refresh": + return { + label: crud.dict.label.refresh, + callback(done: fn) { + crud.refresh(); + done(); + } + }; + case "edit": + case "update": + return { + label: crud.dict.label.update, + hidden: !crud.getPermission("update"), + callback(done: fn) { + crud.rowEdit(row); + done(); + } + }; + case "delete": + return { + label: crud.dict.label.delete, + hidden: !crud.getPermission("delete"), + callback(done: fn) { + crud.rowDelete(row); + done(); + } + }; + case "info": + return { + label: crud.dict.label.info, + hidden: !crud.getPermission("info"), + callback(done: fn) { + crud.rowInfo(row); + done(); + } + }; + case "check": + return { + label: crud.selection.find((e) => e.id == row.id) + ? crud.dict.label.deselect + : crud.dict.label.select, + hidden: !config.columns.find((e) => e.type === "selection"), + callback(done: fn) { + Table.value.toggleRowSelection(row); + done(); + } + }; + case "order-desc": + return { + label: `${column.label} - ${crud.dict.label.desc}`, + hidden: !column.sortable, + callback(done: fn) { + Sort.changeSort(column.property, "desc"); + done(); + } + }; + case "order-asc": + return { + label: `${column.label} - ${crud.dict.label.asc}`, + hidden: !column.sortable, + callback(done: fn) { + Sort.changeSort(column.property, "asc"); + done(); + } + }; + default: + if (isFunction(e)) { + return e(row, column, event); + } else { + return e; + } + } + }) + .filter((e) => Boolean(e) && !e.hidden); + + // 打开菜单 + if (!isEmpty(list)) { + ContextMenu.open(event, { + list + }); + } + } + + // 回调 + if (config.onRowContextmenu) { + config.onRowContextmenu(row, column, event); + } + } + + return { + onRowContextMenu + }; +} diff --git a/packages/crud/src/components/table/helper/selection.ts b/packages/crud/src/components/table/helper/selection.ts new file mode 100644 index 0000000..67a2dd2 --- /dev/null +++ b/packages/crud/src/components/table/helper/selection.ts @@ -0,0 +1,16 @@ +import { useCore } from "../../../hooks"; + +export function useSelection({ emit }: { emit: Vue.Emit }) { + const { crud } = useCore(); + + // 选择项发生变化 + function onSelectionChange(selection: any[]) { + crud.selection.splice(0, crud.selection.length, ...selection); + emit("selection-change", crud.selection); + } + + return { + selection: crud.selection, + onSelectionChange + }; +} diff --git a/packages/crud/src/components/table/helper/sort.ts b/packages/crud/src/components/table/helper/sort.ts new file mode 100644 index 0000000..2b95fe8 --- /dev/null +++ b/packages/crud/src/components/table/helper/sort.ts @@ -0,0 +1,86 @@ +import { useCore } from "../../../hooks"; + +// 排序 +export function useSort({ + config, + Table, + emit +}: { + config: ClTable.Config; + Table: Vue.Ref; + emit: Vue.Emit; +}) { + const { crud } = useCore(); + + // 设置默认排序Ï + const defaultSort = (function () { + let { prop, order } = config.defaultSort || {}; + + const item = config.columns.find((e) => + ["desc", "asc", "descending", "ascending"].find((a) => a == e.sortable) + ); + + if (item) { + prop = item.prop; + order = ["descending", "desc"].find((a) => a == item.sortable) + ? "descending" + : "ascending"; + } + + if (order && prop) { + crud.params.order = ["descending", "desc"].includes(order) ? "desc" : "asc"; + crud.params.prop = prop; + + return { + prop, + order + }; + } + + return {}; + })(); + + // 排序监听 + function onSortChange({ prop, order }: { prop: string | undefined; order: string }) { + if (config.sortRefresh) { + if (order === "descending") { + order = "desc"; + } + + if (order === "ascending") { + order = "asc"; + } + + if (!order) { + prop = undefined; + } + + crud.refresh({ + prop, + order, + page: 1 + }); + } + + emit("sort-change", { prop, order }); + } + + // 改变排序 + function changeSort(prop: string, order: string) { + if (order === "desc") { + order = "descending"; + } + + if (order === "asc") { + order = "ascending"; + } + + Table.value?.sort(prop, order); + } + + return { + defaultSort, + onSortChange, + changeSort + }; +} diff --git a/packages/crud/src/components/table/index.tsx b/packages/crud/src/components/table/index.tsx new file mode 100644 index 0000000..3120841 --- /dev/null +++ b/packages/crud/src/components/table/index.tsx @@ -0,0 +1,165 @@ +import { defineComponent, h } from "vue"; +import { + useRow, + useHeight, + useRender, + useSort, + useData, + useSelection, + useOp, + useTable +} from "./helper"; +import { useCore, useProxy, useElApi, useConfig } from "../../hooks"; +import { usePlugins } from "./helper/plugins"; + +export default defineComponent({ + name: "cl-table", + + props: { + // 列配置 + columns: { + type: Array, + default: () => [] + }, + // 是否自动计算高度 + autoHeight: { + type: Boolean, + default: null + }, + // 固定高度 + height: null, + // 右键菜单 + contextMenu: { + type: [Array, Boolean], + default: null + }, + // 默认排序 + defaultSort: Object, + // 排序后是否刷新 + sortRefresh: { + type: Boolean, + default: true + }, + // 空数据显示文案 + emptyText: String, + // 当前行的 key + rowKey: { + type: String, + default: "id" + } + }, + + emits: ["selection-change", "sort-change"], + + setup(props, { emit, expose }) { + const { crud } = useCore(); + const { style } = useConfig(); + const { Table, config } = useTable(props); + const plugin = usePlugins(); + + // 排序 + const Sort = useSort({ config, emit, Table }); + + // 行 + const Row = useRow({ + config, + Table, + Sort + }); + + // 高度 + const Height = useHeight({ config, Table }); + + // 数据 + const Data = useData({ config, Table }); + + // 多选 + const Selection = useSelection({ emit }); + + // 操作 + const Op = useOp({ config }); + + // 方法 + const ElTableApi = useElApi( + [ + "clearSelection", + "getSelectionRows", + "toggleRowSelection", + "toggleAllSelection", + "toggleRowExpansion", + "setCurrentRow", + "clearSort", + "clearFilter", + "doLayout", + "sort", + "scrollTo", + "setScrollTop", + "setScrollLeft", + "updateKeyChildren" + ], + Table + ); + + const ctx = { + Table, + config, + columns: config.columns, + ...Selection, + ...Data, + ...Sort, + ...Row, + ...Height, + ...Op, + ...ElTableApi + }; + + useProxy(ctx); + expose(ctx); + plugin.create(config.plugins); + + return () => { + const { renderColumn, renderAppend, renderEmpty } = useRender(); + + return ( + ctx.visible.value && + h( + , + { + ...config.on, + ...config.props, + + // config + maxHeight: config.autoHeight ? ctx.maxHeight.value : null, + height: config.autoHeight ? config.height : null, + rowKey: config.rowKey, + + // ctx + defaultSort: ctx.defaultSort, + data: ctx.data.value, + onRowContextmenu: ctx.onRowContextMenu, + onSelectionChange: ctx.onSelectionChange, + onSortChange: ctx.onSortChange, + + // style + size: style.size, + border: style.table.border, + highlightCurrentRow: style.table.highlightCurrentRow, + resizable: style.table.resizable, + stripe: style.table.stripe, + }, + { + default() { + return renderColumn(ctx.columns); + }, + empty() { + return renderEmpty(config.emptyText || crud.dict.label.empty); + }, + append() { + return renderAppend(); + } + } + ) + ); + }; + } +}); diff --git a/packages/crud/src/components/upsert/index.tsx b/packages/crud/src/components/upsert/index.tsx new file mode 100644 index 0000000..37c7f87 --- /dev/null +++ b/packages/crud/src/components/upsert/index.tsx @@ -0,0 +1,306 @@ +import { defineComponent, h, inject, reactive, ref, toRefs } from "vue"; +import { ElMessage } from "element-plus"; +import { useCore, useProxy } from "../../hooks"; +import { useApi } from "../form/helper"; +import { mergeConfig } from "../../utils"; + +export default defineComponent({ + name: "cl-upsert", + + props: { + // 表单项 + items: { + type: Array, + default: () => [] + }, + // 参数 + props: Object, + // 编辑时是否同步打开 + sync: Boolean, + // 操作按钮参数 + op: Object, + // 参数 + dialog: Object, + // 打开表单钩子 + onOpen: Function, + // 打开表单后钩子 + onOpened: Function, + // 关闭表单钩子 + onClose: Function, + // 关闭表单后钩子 + onClosed: Function, + // 获取表单数据钩子 + onInfo: Function, + // 表单提交钩子 + onSubmit: Function + }, + + emits: ["opened", "closed"], + + setup(props, { slots, expose }) { + const { crud } = useCore(); + + const config = reactive( + mergeConfig(props, inject("useUpsert__options") || {}) + ); + + // el-form + const Form = ref(); + + // 模式 + const mode = ref("info"); + + // 关闭表单 + function close(action?: ClForm.CloseAction) { + Form.value?.close(action); + } + + // 关闭后 + function onClosed() { + Form.value?.hideLoading(); + + if (config.onClosed) { + config.onClosed(); + } + } + + // 关闭前 + function beforeClose(action: ClForm.CloseAction, done: fn) { + function next() { + done(); + onClosed(); + } + + if (config.onClose) { + config.onClose(action, next); + } else { + next(); + } + } + + // 提交 + function submit(data: obj) { + const { service, dict, refresh } = crud; + + function done() { + Form.value?.done(); + } + + function next(data: obj) { + return new Promise((resolve, reject) => { + // 发送请求 + service[dict.api[mode.value]](data) + .then((res) => { + ElMessage.success(dict.label.saveSuccess); + done(); + close("save"); + refresh(); + resolve(res); + }) + .catch((err) => { + ElMessage.error(err.message); + done(); + reject(err); + }); + }); + } + + // 提交钩子 + if (config.onSubmit) { + config.onSubmit(data, { + done, + next, + close() { + close("save"); + } + }); + } else { + next(data); + } + } + + // 打开表单 + function open() { + // 是否禁用 + const isDisabled = mode.value == "info"; + + return new Promise((resolve) => { + if (!Form.value) { + return console.error(" is not found"); + } + + Form.value?.open( + { + title: crud.dict.label[mode.value], + props: { + ...config.props, + disabled: isDisabled + }, + op: { + ...config.op, + hidden: isDisabled + }, + dialog: config.dialog, + items: config.items || [], + on: { + open() { + if (config.onOpen) { + config.onOpen(); + } + + resolve(true); + }, + submit, + close: beforeClose + }, + form: {}, + _data: { + isDisabled + } + }, + config.plugins + ); + }); + } + + // 打开后事件 + function onOpened() { + const data = Form.value?.getForm(); + + if (config.onOpened) { + config.onOpened(data); + } + } + + // 新增 + async function add() { + mode.value = "add"; + + // 打开中 + await open(); + + // 打开后 + onOpened(); + } + + // 追加 + async function append(data: any) { + mode.value = "add"; + + // 打开中 + await open(); + + // 绑定值 + if (data) { + Form.value?.bindForm(data); + } + + // 打开后 + onOpened(); + } + + // 编辑 + function edit(data?: any) { + mode.value = "update"; + getInfo(data); + } + + // 详情 + function info(data?: any) { + mode.value = "info"; + getInfo(data); + } + + // 信息 + function getInfo(data: any) { + // 显示加载中 + Form.value?.showLoading(); + + // 是否同步打开 + if (!config.sync) { + open(); + } + + // 完成 + async function done(data?: any) { + // 加载完成 + Form.value?.hideLoading(); + + // 合并数据 + if (data) { + Form.value?.bindForm(data); + } + + // 同步打开表单 + if (config.sync) { + await open(); + } + + onOpened(); + } + + // 获取详情 + function next(data: any): Promise { + return new Promise(async (resolve, reject) => { + // 发送请求 + await crud.service[crud.dict.api.info]({ + [crud.dict.primaryId]: data[crud.dict.primaryId] + }) + .then((res) => { + done(res); + resolve(res); + }) + .catch((err) => { + ElMessage.error(err.message); + reject(err); + }); + + // 隐藏加载框 + Form.value?.hideLoading(); + }); + } + + // 详情钩子 + if (config.onInfo) { + config.onInfo(data, { + close, + next, + done + }); + } else { + next(data); + } + } + + // 完成 + function done() { + Form.value?.hideLoading(); + } + + const ctx = { + config, + ...toRefs(config), + ...useApi({ Form }), + Form, + get form() { + return Form.value?.form || {}; + }, + mode, + add, + append, + edit, + info, + open, + close, + done, + submit + }; + + useProxy(ctx); + expose(ctx); + + return () => { + return
{h(, {}, slots)}
; + }; + } +}); diff --git a/packages/crud/src/emitter.ts b/packages/crud/src/emitter.ts new file mode 100644 index 0000000..3099ff4 --- /dev/null +++ b/packages/crud/src/emitter.ts @@ -0,0 +1,27 @@ +export const crudList: ClCrud.Ref[] = []; + +export const emitter: Emitter = { + list: [], + init(events) { + for (const i in events) { + this.on(i, events[i]); + } + }, + emit(name, data) { + this.list.forEach((e: EmitterItem) => { + const [_name] = e.name.split("-"); + + if (name == _name) { + e.callback(data, { + crudList, + refresh(params) { + crudList.forEach((c) => c.refresh(params)); + } + }); + } + }); + }, + on(name, callback) { + this.list.push({ name, callback }); + } +}; diff --git a/packages/crud/src/entry.ts b/packages/crud/src/entry.ts new file mode 100644 index 0000000..07562c1 --- /dev/null +++ b/packages/crud/src/entry.ts @@ -0,0 +1,30 @@ +import { type App } from "vue"; +import { useComponent } from "./components"; +import { useProvide } from "./provide"; +import global from "./utils/global"; +import "./static/index.scss"; + +const Crud = { + install(app: App, options?: any) { + global.set("__CrudApp__", app); + + // 穿透值 + useProvide(app, options); + + // 设置组件 + useComponent(app); + + return { + name: "cl-crud" + }; + } +}; + +export { Crud }; + +export * from "./emitter"; +export * from "./hooks"; +export * from "./locale"; +export { registerFormHook } from "./utils/form-hook"; +export { renderNode } from "./utils/vnode"; +export { ContextMenu } from "./components/context-menu"; diff --git a/packages/crud/src/hooks/crud.ts b/packages/crud/src/hooks/crud.ts new file mode 100644 index 0000000..5570134 --- /dev/null +++ b/packages/crud/src/hooks/crud.ts @@ -0,0 +1,191 @@ +import { assign } from "lodash-es"; +import { TestService } from "../test/service"; +import { watch, ref, nextTick, getCurrentInstance, type Ref, inject, provide } from "vue"; + +// 获取上级 +function useParent(name: string, r: Ref) { + const d = getCurrentInstance(); + + if (d) { + let parent = d.proxy?.$.parent; + + if (parent) { + while (parent && parent.type?.name != name && parent.type?.name != "cl-crud") { + parent = parent?.parent; + } + + if (parent) { + if (parent.type.name == name) { + r.value = parent.exposed; + } + } + } + } +} + +// 多事件 +function useEvent( + names: string[], + { r, options, clear, isChild }: { r: any; options: any; clear?: string; isChild?: boolean } +) { + if (!r.__ev) r.__ev = {}; + + const d: { [key: string]: (args: any[]) => void } = {}; + const ev = r.__ev as { [key: string]: { fn: any; isChild?: boolean }[] }; + + names.forEach((k) => { + if (!ev[k]) ev[k] = []; + + if (options[k]) { + ev[k].push({ + fn: options[k], + isChild + }); + } + + d[k] = (...args: any[]) => { + ev[k].forEach((e) => { + if (e.fn) { + e.fn(...args); + } + }); + + if (clear == k) { + for (const i in ev) { + ev[i] = ev[i].filter((e) => !e.isChild); + } + } + }; + }); + + return d; +} + +// crud +export function useCrud(options?: ClCrud.Options, cb?: (app: ClCrud.Ref) => void) { + const Crud = ref(); + useParent("cl-crud", Crud); + + if (options) { + // 测试模式 + if (options.service == "test") { + options.service = new TestService(); + } + + provide("useCrud__options", options); + } + + watch(Crud, (val) => { + if (val) { + if (cb) { + cb(val); + } + } + }); + + return Crud; +} + +// 新增、编辑 +export function useUpsert(options?: ClUpsert.Options) { + const Upsert = ref(); + useParent("cl-upsert", Upsert); + const isChild = !!Upsert.value; + + if (options) { + provide("useUpsert__options", options); + } + + watch( + Upsert, + (val) => { + if (val) { + if (options) { + const event = useEvent(["onOpen", "onOpened", "onClosed"], { + r: val, + options, + clear: "onClosed", + isChild + }); + + assign(val.config, event); + } + } + }, + { + immediate: true + } + ); + + return Upsert; +} + +// 表格 +export function useTable(options?: ClTable.Options, cb?: (table: ClTable.Ref) => void) { + const Table = ref>(); + useParent("cl-table", Table); + + if (options) { + provide("useTable__options", options); + } + + watch(Table, (val) => { + if (val) { + if (cb) { + cb(val); + } + } + }); + + return Table; +} + +// 表单 +export function useForm(cb?: (app: ClForm.Ref) => void) { + const Form = ref>(); + useParent("cl-form", Form); + + nextTick(() => { + if (cb && Form.value) { + cb(Form.value); + } + }); + + return Form; +} + +// 高级搜索 +export function useAdvSearch(options?: ClAdvSearch.Options) { + const AdvSearch = ref>(); + useParent("cl-adv-search", AdvSearch); + + if (options) { + provide("useAdvSearch__options", options); + } + + return AdvSearch; +} + +// 搜索 +export function useSearch(options?: ClSearch.Options) { + const Search = ref>(); + useParent("cl-search", Search); + + provide("useSearch__options", options); + + return Search; +} + +// 对话框 +export function useDialog(options?: { onFullscreen(visible: boolean): void }) { + const Dialog = inject("dialog") as ClDialog.Provide; + + watch( + () => Dialog?.fullscreen.value, + (val) => { + options?.onFullscreen(val); + } + ); + + return Dialog; +} diff --git a/packages/crud/src/hooks/index.ts b/packages/crud/src/hooks/index.ts new file mode 100644 index 0000000..14fd596 --- /dev/null +++ b/packages/crud/src/hooks/index.ts @@ -0,0 +1,74 @@ +import { Mitt } from "../utils/mitt"; +import { isFunction } from "lodash-es"; +import { getCurrentInstance, inject, reactive } from "vue"; + +export function useCore() { + const crud = inject("crud") as ClCrud.Ref; + const mitt = inject("mitt") as Mitt; + + return { + crud, + mitt + }; +} + +export function useConfig() { + return inject("__config__") as Config; +} + +export function useBrowser() { + return inject("__browser__") as Browser; +} + +export function useRefs() { + const refs = reactive<{ [key: string]: obj }>({}); + + function setRefs(name: string) { + return (el: any) => { + refs[name] = el; + }; + } + + return { refs, setRefs }; +} + +export function useProxy(ctx: any) { + const { type }: any = getCurrentInstance(); + const { mitt, crud } = useCore(); + + // 挂载 + crud[type.name] = ctx; + + // 事件 + mitt.on("crud.proxy", ({ name, data = [], callback }: any) => { + if (ctx[name]) { + let d = null; + + if (isFunction(ctx[name])) { + d = ctx[name](...data); + } else { + d = ctx[name]; + } + + if (callback) { + callback(d); + } + } + }); + + return ctx; +} + +export function useElApi(keys: string[], el: any) { + const apis: obj = {}; + + keys.forEach((e) => { + apis[e] = (...args: any[]) => { + return el.value[e](...args); + }; + }); + + return apis; +} + +export * from "./crud"; diff --git a/packages/crud/src/index.ts b/packages/crud/src/index.ts new file mode 100644 index 0000000..363490f --- /dev/null +++ b/packages/crud/src/index.ts @@ -0,0 +1 @@ +export * from "./entry"; diff --git a/packages/crud/src/locale/en.ts b/packages/crud/src/locale/en.ts new file mode 100644 index 0000000..0de015e --- /dev/null +++ b/packages/crud/src/locale/en.ts @@ -0,0 +1,33 @@ +export default { + op: "Operation", + add: "Add", + delete: "Delete", + multiDelete: "Delete", + update: "Edit", + refresh: "Refresh", + info: "Details", + search: "Search", + reset: "Reset", + clear: "Clear", + save: "Save", + close: "Cancel", + confirm: "Confirm", + advSearch: "Advanced Search", + searchKey: "Search Keyword", + placeholder: "Please enter", + tips: "Tips", + saveSuccess: "Save successful", + deleteSuccess: "Delete successful", + deleteConfirm: + "This operation will permanently delete the selected data. Do you want to continue?", + empty: "No data available", + desc: "Descending", + asc: "Ascending", + select: "Select", + deselect: "Deselect", + seeMore: "See more", + hideContent: "Hide content", + nonEmpty: "{label} cannot be empty", + collapse: "Collapse", + expand: "Expand" +}; diff --git a/packages/crud/src/locale/index.ts b/packages/crud/src/locale/index.ts new file mode 100644 index 0000000..087df5e --- /dev/null +++ b/packages/crud/src/locale/index.ts @@ -0,0 +1,11 @@ +import en from "./en"; +import ja from "./ja"; +import zhCn from "./zh-cn"; +import zhTw from "./zh-tw"; + +export const locale = { + en, + ja, + "zh-cn": zhCn, + "zh-tw": zhTw +}; diff --git a/packages/crud/src/locale/ja.ts b/packages/crud/src/locale/ja.ts new file mode 100644 index 0000000..9d67240 --- /dev/null +++ b/packages/crud/src/locale/ja.ts @@ -0,0 +1,32 @@ +export default { + op: "操作", + add: "追加", + delete: "削除", + multiDelete: "削除", + update: "編集", + refresh: "リフレッシュ", + info: "詳細", + search: "検索", + reset: "リセット", + clear: "クリア", + save: "保存", + close: "キャンセル", + confirm: "確認", + advSearch: "高度な検索", + searchKey: "検索キーワード", + placeholder: "入力してください", + tips: "ヒント", + saveSuccess: "保存が成功しました", + deleteSuccess: "削除が成功しました", + deleteConfirm: "この操作は選択したデータを永久に削除します。続行しますか?", + empty: "データがありません", + desc: "降順", + asc: "昇順", + select: "選択", + deselect: "選択解除", + seeMore: "詳細を表示", + hideContent: "コンテンツを非表示", + nonEmpty: "{label}は空にできません", + collapse: "折り畳む", + expand: "展開" +}; diff --git a/packages/crud/src/locale/zh-cn.ts b/packages/crud/src/locale/zh-cn.ts new file mode 100644 index 0000000..69d9e7d --- /dev/null +++ b/packages/crud/src/locale/zh-cn.ts @@ -0,0 +1,32 @@ +export default { + op: "操作", + add: "新增", + delete: "删除", + multiDelete: "删除", + update: "编辑", + refresh: "刷新", + info: "详情", + search: "搜索", + reset: "重置", + clear: "清空", + save: "保存", + close: "取消", + confirm: "确定", + advSearch: "高级搜索", + searchKey: "搜索关键字", + placeholder: "请输入", + tips: "提示", + saveSuccess: "保存成功", + deleteSuccess: "删除成功", + deleteConfirm: "此操作将永久删除选中数据,是否继续?", + empty: "暂无数据", + desc: "降序", + asc: "升序", + select: "选择", + deselect: "取消选择", + seeMore: "查看更多", + hideContent: "隐藏内容", + nonEmpty: "{label}不能为空", + collapse: "收起", + expand: "展开更多" +}; diff --git a/packages/crud/src/locale/zh-tw.ts b/packages/crud/src/locale/zh-tw.ts new file mode 100644 index 0000000..dbd83e8 --- /dev/null +++ b/packages/crud/src/locale/zh-tw.ts @@ -0,0 +1,32 @@ +export default { + op: "操作", + add: "新增", + delete: "刪除", + multiDelete: "刪除", + update: "編輯", + refresh: "刷新", + info: "詳情", + search: "搜尋", + reset: "重置", + clear: "清空", + save: "保存", + close: "取消", + confirm: "確定", + advSearch: "高級搜索", + searchKey: "搜索關鍵字", + placeholder: "請輸入", + tips: "提示", + saveSuccess: "保存成功", + deleteSuccess: "刪除成功", + deleteConfirm: "此操作將永久刪除選中數據,是否繼續?", + empty: "暫無數據", + desc: "降序", + asc: "升序", + select: "選擇", + deselect: "取消選擇", + seeMore: "查看更多", + hideContent: "隱藏內容", + nonEmpty: "{label}不能為空", + collapse: "收起", + expand: "展開" +}; diff --git a/packages/crud/src/main.ts b/packages/crud/src/main.ts new file mode 100644 index 0000000..e667063 --- /dev/null +++ b/packages/crud/src/main.ts @@ -0,0 +1,28 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +import { Crud, locale } from "./entry"; +// import Crud, { locale } from "../dist/index.umd"; +// import "../dist/index.css"; + +import ElementPlus from "element-plus"; +import "element-plus/dist/index.css"; + +const app = createApp(App); + +app.use(ElementPlus) + .use(Crud, { + dict: { + sort: { + prop: "order", + order: "sort" + }, + label: locale["zh-cn"] + }, + style: { + // size: "default" + }, + render: { + autoHeight: true + } + }) + .mount("#app"); diff --git a/packages/crud/src/provide.ts b/packages/crud/src/provide.ts new file mode 100644 index 0000000..0248bff --- /dev/null +++ b/packages/crud/src/provide.ts @@ -0,0 +1,129 @@ +import { type App, reactive } from "vue"; +import { mitt } from "./utils/mitt"; +import { emitter } from "./emitter"; +import { locale } from "./locale"; +import { merge } from "./utils"; + +// 设置配置 +function setConfig(app: App, options: Options = {}) { + const config = merge( + { + permission: { + update: true, + page: true, + info: true, + list: true, + add: true, + delete: true + }, + dict: { + primaryId: "id", + api: { + list: "list", + add: "add", + update: "update", + delete: "delete", + info: "info", + page: "page" + }, + pagination: { + page: "page", + size: "size" + }, + search: { + keyWord: "keyWord", + query: "query" + }, + sort: { + order: "order", + prop: "prop" + }, + label: locale["zh-cn"] + }, + style: { + colors: [ + "#d42ca8", + "#1c109d", + "#6d17c3", + "#6dc9f1", + "#04c273", + "#06b31c", + "#f9f494", + "#aa7a24", + "#d57121", + "#e93f4d" + ], + form: { + labelPostion: "right", + labelWidth: "100px", + span: 24 + }, + table: { + border: true, + highlightCurrentRow: true, + autoHeight: true, + contextMenu: ["refresh", "check", "edit", "delete", "order-asc", "order-desc"], + column: { + align: "center", + opWidth: 180 + } + } + }, + events: {} + } as Options, + options + ); + + // 初始化事件 + if (config.events) { + emitter.init(config.events); + } + + app.provide("__config__", config); + + return config; +} + +// 设置浏览器 +function setBrowser(app: App) { + // 浏览器信息 + const browser = reactive({ + isMini: false, + screen: "full" + }); + + // 更新信息 + function update() { + const w = document.body.clientWidth; + + if (w < 768) { + browser.screen = "xs"; + } else if (w < 992) { + browser.screen = "sm"; + } else if (w < 1200) { + browser.screen = "md"; + } else if (w < 1920) { + browser.screen = "xl"; + } else { + browser.screen = "full"; + } + + browser.isMini = browser.screen === "xs"; + } + + // 监听浏览器窗口变化 + window.addEventListener("resize", () => { + update(); + + // 事件 + mitt.emit("resize"); + }); + + update(); + app.provide("__browser__", browser); +} + +export function useProvide(app: App, options: Options = {}) { + setBrowser(app); + setConfig(app, options); +} diff --git a/packages/crud/src/static/index.scss b/packages/crud/src/static/index.scss new file mode 100644 index 0000000..1b7ee65 --- /dev/null +++ b/packages/crud/src/static/index.scss @@ -0,0 +1,862 @@ +.cl-crud { + height: 100%; + overflow: hidden auto; + position: relative; + box-sizing: border-box; + background-color: #fff; + + &.is-border { + border: 1px solid var(--el-border-color); + border-radius: var(--el-border-radius-base); + } + + & > .cl-row { + width: 100%; + + &:not(.cl-row--last) > * { + margin: 0 10px 10px 0; + + &:last-child { + margin-right: 0; + } + } + + .cl-flex1 { + margin-right: 0; + } + } +} + +.cl-flex1 { + flex: 1; + font-size: 12px; +} + +.cl-search-key { + display: inline-flex; + + &__select { + margin-right: 10px; + + &.el-select { + width: 100px; + } + } + + &__wrap { + display: inline-flex; + + .el-input { + flex: 1; + } + + .el-button { + margin-left: 10px; + } + } +} + +.cl-table { + width: 100%; + + .el-table { + &.el-loading-parent--relative { + box-sizing: border-box; + } + + &__header { + .el-table__cell { + background-color: var(--el-fill-color-lighter) !important; + color: var(--el-text-color-primary); + + .cell { + line-height: normal; + } + + &.is-sortable { + .cl-table-header__search { + width: auto; + + &.is-input { + width: calc(100% - 24px) !important; + } + } + } + } + } + + &__empty-block { + height: auto !important; + } + } + + .el-loading-mask { + .el-loading-spinner { + .el-icon-loading { + font-size: 25px; + color: #000; + } + + .el-loading-text { + color: var(--el-text-color-secondary); + margin-top: 5px; + } + } + } + + &__op { + margin-bottom: -5px; + + .el-button { + margin-bottom: 5px; + outline-offset: -2px !important; + + &.is-text { + border: 1px solid var(--el-button-border-color) !important; + + &:hover { + background-color: var(--el-button-bg-color) !important; + } + } + } + } + + .cl-table-header__search { + display: inline-flex; + align-items: center; + gap: 5px; + width: 100%; + cursor: pointer; + + &-label { + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + } + + &:hover { + color: var(--el-color-primary); + } + + &-inner { + flex: 1; + + & > div { + width: 100%; + + .el-date-editor { + margin-right: 0; + } + } + } + + &-close { + font-size: 14px; + height: 30px; + width: 30px; + border: 1px solid var(--el-border-color); + border-radius: 6px; + background-color: var(--el-fill-color-blank); + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; + color: var(--el-text-color-secondary); + + &:hover { + border-color: var(--el-border-color-hover); + color: var(--el-text-color-primary); + } + } + } + + .is-left { + .cl-table-header__search-label { + justify-content: flex-start; + } + } + + .is-right { + .cl-table-header__search-label { + justify-content: flex-end; + } + } +} + +.cl-pagination { + &.el-pagination { + --el-pagination-border-radius: var(--el-border-radius-base); + } + + .btn-prev, + .btn-next, + .el-pager li { + border-radius: var(--el-border-radius-base); + } +} + +.cl-filter { + display: flex; + align-items: center; + margin: 0 10px; + + &__label { + font-size: 12px; + margin-right: 10px; + white-space: nowrap; + } + + .el-select { + min-width: 120px; + } +} + +.cl-search { + &__btns { + margin-left: 5px; + } + + &__more { + display: flex; + align-items: center; + justify-content: space-between; + + .el-form-item { + margin-bottom: 0; + } + } + + .el-form:not(.el-form--label-top) { + .el-form-item__label { + &:empty { + display: none; + } + } + + .cl-search__btns { + .el-form-item__label { + display: none; + } + } + } + + .cl-search__btns { + .el-button + .el-button { + margin-left: 10px; + } + } + + &.is-inline { + margin-bottom: 0 !important; + } + + &.is-collapse { + background-color: var(--el-fill-color-lighter); + padding: 10px; + margin-bottom: 10px !important; + border-radius: 6px; + border: 1px solid var(--el-border-color-extra-light); + + &.is-fold { + .cl-search__form { + max-height: 42px; + overflow: hidden; + + &:has(.el-form--label-top) { + max-height: 68px; + } + } + } + } +} + +.cl-adv-btn { + margin-left: 10px; + + .el-icon { + margin-right: 5px; + } +} + +.cl-adv-search { + &.el-drawer { + background-color: #fff; + } + + .el-drawer__body { + padding: 0; + } + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + height: 50px; + padding: 0 15px 0 20px; + user-select: none; + + .text { + font-size: 16px; + } + + .el-icon { + cursor: pointer; + + &:hover { + color: red; + } + } + } + + &__container { + height: calc(100% - 110px); + overflow-y: auto; + padding: 10px 20px; + box-sizing: border-box; + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + border-radius: 6px; + background-color: rgba(144, 147, 153, 0.3); + } + + .el-form-item__content { + & > div { + width: 100%; + } + } + } + + &__footer { + display: flex; + align-items: center; + justify-content: flex-end; + height: 60px; + border-top: 1px solid var(--el-border-color-extra-light); + padding: 0 10px; + box-sizing: border-box; + } +} + +.cl-form { + [class*="el-col-"].is-guttered { + min-height: 0; + } + + &-item { + display: flex; + + &__component { + display: flex; + + &.flex1 { + flex: 1; + width: 100%; + + & > div { + width: 100%; + } + } + } + + &__prepend { + margin-right: 10px; + } + + &__append { + margin-left: 10px; + } + + &__collapse { + width: 100%; + font-size: 12px; + cursor: pointer; + + .el-divider { + margin: 16px 0; + + &__text { + font-size: 12px; + } + } + + i { + margin-left: 6px; + } + } + + .el-table__header tr { + line-height: normal; + } + } + + &__footer { + display: flex; + justify-content: flex-end; + } + + .cl-crud { + line-height: normal; + } + + .el-form { + .el-form-item { + .el-form-item { + margin-bottom: 18px; + } + + .el-input-number { + &__decrease, + &__increase { + border: 0; + background-color: transparent; + } + } + + &__label { + .el-tooltip { + i { + margin-left: 5px; + } + } + } + + &__content { + min-width: 0px; + + & > div { + width: 100%; + } + } + } + + &:not(.el-form--label-top) { + .el-form-item { + &.no-label { + & > .el-form-item__label { + padding: 0; + display: none; + } + } + } + } + + &.el-form--label-top { + .el-form-item { + margin-bottom: 22px; + } + + .el-form-item__label { + margin: 0 0 4px 0; + min-height: 22px; + } + + .el-form-item__error { + padding-top: 4px; + } + } + + &.el-form--inline { + .cl-form__items { + display: flex; + flex-wrap: wrap; + } + + .el-form-item { + margin: 0 10px 10px 0; + + .el-date-editor { + box-sizing: border-box; + + .el-range-input { + &:nth-child(2) { + margin-left: 5px; + } + } + } + + .el-select { + width: 173px; + } + + &:last-child { + margin-right: 0; + } + } + } + } +} + +.cl-form-tabs { + border-bottom: 1px solid var(--el-border-color); + overflow: hidden; + width: calc(100% - 10px); + margin: 0 5px 20px 5px; + + &__wrap { + height: 35px; + width: 100%; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + -ms-overflow-style: none; + position: relative; + + &::-webkit-scrollbar { + display: none; + } + } + + ul { + display: inline-flex; + white-space: nowrap; + margin: 0; + padding: 0; + + li { + display: inline-flex; + align-items: center; + list-style: none; + padding: 0 20px; + height: 35px; + cursor: pointer; + + .el-icon { + margin-right: 5px; + font-size: 16px; + } + + &.is-active { + color: var(--el-color-primary); + } + } + } + + &__line { + height: 3px; + width: 100%; + position: absolute; + bottom: -1px; + left: 0; + transition: + transform 0.3s ease-in-out, + width 0.2s 0.1s cubic-bezier(0.645, 0.045, 0.355, 1); + background-color: var(--el-color-primary); + } + + &--card { + .cl-form-tabs__line { + display: none; + } + + ul { + border: 1px solid var(--el-border-color); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + + li { + border-left: 1px solid var(--el-border-color); + + &:first-child { + border-left-width: 0; + } + } + } + } +} + +.cl-form-card { + margin-top: 0; + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 14px; + height: 32px; + line-height: normal; + font-weight: bold; + padding: 0 10px; + background-color: var(--el-fill-color-lighter); + border-radius: var(--el-border-radius-base); + cursor: pointer; + user-select: none; + + &:hover { + background-color: var(--el-fill-color-light); + } + } + + &__container { + transition: all 0.3s; + display: grid; + grid-template-rows: 0fr; + + > .cl-form-item__children { + min-height: 0; + overflow: hidden; + + .el-row { + margin-top: 10px; + } + } + } + + &.is-expand { + > .cl-form-card__container { + grid-template-rows: 1fr; + margin-bottom: -18px; + } + } + + .cl-form-card { + margin-left: 10px; + } +} + +.cl-dialog { + display: flex; + flex-direction: column; + + &.el-dialog { + padding: 0; + border-radius: 8px; + } + + .el-dialog { + &__header { + padding: 0; + margin-right: 0; + + &-slot { + &.is-drag { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + -khtml-user-select: none; + user-select: none; + cursor: move; + } + } + } + + &__body { + padding: 0; + box-sizing: border-box; + flex: 1; + overflow: hidden; + } + + &__footer { + padding: 0; + } + } + + &__header { + position: relative; + padding: 10px; + border-bottom: 1px solid var(--el-border-color-extra-light); + text-align: center; + user-select: none; + } + + &__default { + box-sizing: border-box; + } + + &__footer { + border-top: 1px solid var(--el-border-color-extra-light); + padding: 20px; + } + + &__title { + display: block; + font-size: 15px; + letter-spacing: 0.5px; + } + + &__controls { + display: flex; + justify-content: flex-end; + position: absolute; + right: 8px; + top: 8px; + z-index: 9; + width: 100%; + + &-icon, + .minimize, + .maximize, + .close { + display: flex; + align-items: center; + justify-content: center; + height: 28px; + width: 28px; + border: 0; + background-color: transparent; + cursor: pointer; + outline: none; + border-radius: 6px; + margin-left: 5px; + + i { + font-size: 18px; + } + + &:hover { + background-color: var(--el-fill-color-darker); + } + } + } + + &.hidden-header { + .el-dialog__header { + display: none; + } + } + + &.is-fullscreen { + height: 100vh !important; + border-radius: 0; + overflow: hidden; + + .cl-dialog__container { + height: 100% !important; + } + } + + &.is-transparent { + background-color: transparent !important; + } +} + +.cl-context-menu { + position: absolute; + z-index: 9999; + + &__box { + width: 160px; + background-color: var(--el-bg-color); + border: 1px solid var(--el-border-color-extra-light); + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 2px 4px -2px rgba(0, 0, 0, 0.1); + border-radius: 6px; + position: absolute; + top: 0; + padding: 5px; + + &.is-append { + right: calc(-100% - 5px); + top: -5px; + } + + & > div { + display: flex; + align-items: center; + font-size: 12px; + cursor: pointer; + padding: 5px 15px; + color: var(--el-text-color-primary); + position: relative; + border-radius: 4px; + + span { + flex: 1; + user-select: none; + } + + &:hover { + background-color: var(--el-fill-color-lighter); + } + + i { + &:first-child { + margin-right: 5px; + } + + &:last-child { + margin-left: 5px; + } + } + + &.is-active { + background-color: #f7f7f7; + color: #000; + } + + &.is-ellipsis { + span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + &.is-disabled { + span { + color: #ccc; + + &:hover { + color: #ccc; + } + } + } + } + } + + &__target { + position: relative; + + &::after { + content: ""; + display: block; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 100%; + background-color: rgba(0, 0, 0, 0.05); + } + } +} + +@media only screen and (max-width: 768px) { + .el-table { + &__body { + &-wrapper { + &::-webkit-scrollbar { + height: 6px; + width: 6px; + } + } + } + } + + .cl-search-key { + width: 100%; + margin-right: 0 !important; + + &__wrap { + width: 100% !important; + } + } +} + +.cl-error-message { + display: flex; + align-items: center; + height: 32px; + padding: 0 10px; + font-size: 14px; + color: var(--el-color-danger); + border: 1px solid var(--el-color-danger); + border-radius: 4px; + box-sizing: border-box; + user-select: none; +} diff --git a/packages/crud/src/test/service.ts b/packages/crud/src/test/service.ts new file mode 100644 index 0000000..90e8f8a --- /dev/null +++ b/packages/crud/src/test/service.ts @@ -0,0 +1,231 @@ +import { assign, orderBy } from "lodash-es"; +import { uuid } from "../utils"; + +const userList = [ + { + id: 1, + name: "楚行云", + createTime: "1996-09-14", + wages: 73026, + status: 1, + account: "chuxingyun", + occupation: 4, + phone: 13797353874 + }, + { + id: 2, + name: "秦尘", + createTime: "1977-11-09", + wages: 74520, + status: 0, + account: "qincheng", + occupation: 3, + phone: 18593911044 + }, + { + id: 3, + name: "叶凡", + createTime: "1982-11-28", + wages: 81420, + status: 0, + account: "yefan", + occupation: 1, + phone: 16234136338 + }, + { + id: 4, + name: "白小纯", + createTime: "2012-12-17", + wages: 65197, + status: 1, + account: "baixiaochun", + occupation: 2, + phone: 16325661110 + }, + { + id: 5, + name: "韩立", + createTime: "1982-07-10", + wages: 99107, + status: 1, + account: "hanli", + occupation: 2, + phone: 18486594866 + }, + { + id: 6, + name: "唐三", + createTime: "2019-07-31", + wages: 80658, + status: 1, + account: "tangsan", + occupation: 5, + phone: 15565014642 + }, + { + id: 7, + name: "王林", + createTime: "2009-07-26", + wages: 57408, + status: 1, + account: "wanglin", + occupation: 1, + phone: 13852767084 + }, + { + id: 8, + name: "李强", + createTime: "2016-04-26", + wages: 71782, + status: 1, + account: "liqiang", + occupation: 3, + phone: 18365332834 + }, + { + id: 9, + name: "秦羽", + createTime: "1984-01-18", + wages: 87860, + status: 1, + account: "qinyu", + occupation: 0, + phone: 18149247129 + } +]; + +class TestService { + // 分页列表 + async page(params: any) { + const { keyWord, page, size, sort, order } = params || {}; + + // 关键字查询 + const keyWordLikeFields = ["phone", "name"]; + + // 等值查询 + const fieldEq = ["createTime", "occupation", "status"]; + + // 模糊查询 + const likeFields = ["phone", "name"]; + + // 过滤后的列表 + const list = orderBy(userList, order, sort).filter((e: any) => { + let f = true; + + if (keyWord !== undefined) { + f = !!keyWordLikeFields.find((k) => String(e[k]).includes(String(params.keyWord))); + } + + fieldEq.forEach((k) => { + if (f) { + if (params[k] !== undefined) { + f = e[k] == params[k]; + } + } + }); + + likeFields.forEach((k) => { + if (f) { + if (params[k] !== undefined) { + f = String(e[k]).includes(String(params[k])); + } + } + }); + + return f; + }); + + return new Promise((resolve) => { + // 模拟延迟 + setTimeout(() => { + resolve({ + list: list.slice((page - 1) * size, page * size), + pagination: { + total: list.length, + page, + size + }, + subData: { + wages: list.reduce((a, b) => { + return a + b.wages; + }, 0) + } + }); + }, 500); + }); + } + + // 更新 + async update(params: { id: any; [key: string]: any }) { + const item = userList.find((e) => e.id == params.id); + + if (item) { + assign(item, params); + } + } + + // 新增 + async add(params: any) { + const id = uuid(); + + userList.push({ + id, + ...params + }); + + return id; + } + + // 详情 + async info(params: { id: any }) { + const { id } = params || {}; + return userList.find((e) => e.id == id); + } + + // 删除 + async delete(params: { ids: any[] }) { + const { ids = [] } = params || {}; + + ids.forEach((id) => { + const index = userList.findIndex((e) => e.id == id); + userList.splice(index, 1); + }); + } + + // 全部列表 + async list() { + return userList; + } + + search = { + fieldEq: [ + { + propertyName: "occupation", + comment: "工作", + source: "a.occupation" + } + ], + fieldLike: [ + { + propertyName: "status", + comment: "状态", + dict: ["关闭", "开启"], + source: "a.status" + } + ], + keyWordLikeFields: [ + { + propertyName: "name", + comment: "姓名", + source: "a.name" + }, + { + propertyName: "phone", + comment: "手机号", + source: "a.phone" + } + ] + }; +} + +export { TestService }; diff --git a/packages/crud/src/utils/form-hook.ts b/packages/crud/src/utils/form-hook.ts new file mode 100644 index 0000000..df30051 --- /dev/null +++ b/packages/crud/src/utils/form-hook.ts @@ -0,0 +1,149 @@ +import { isArray, isEmpty, isFunction, isObject, isString } from "lodash-es"; + +export const format: { [key: string]: ClForm.Hook["Fn"] } = { + number(value) { + return value ? (isArray(value) ? value.map(Number) : Number(value)) : value; + }, + string(value) { + return value ? (isArray(value) ? value.map(String) : String(value)) : value; + }, + split(value) { + if (isString(value)) { + return value.split(",").filter(Boolean); + } else if (isArray(value)) { + return value; + } else { + return []; + } + }, + join(value) { + return isArray(value) ? value.join(",") : value; + }, + boolean(value) { + return Boolean(value); + }, + booleanNumber(value) { + return value ? 1 : 0; + }, + datetimeRange(value, { form, method, prop }) { + const key = prop.charAt(0).toUpperCase() + prop.slice(1); + + const start = `start${key}`; + const end = `end${key}`; + + if (method == "bind") { + return [form[start], form[end]]; + } else { + const [startTime, endTime] = value || []; + form[start] = startTime; + form[end] = endTime; + return undefined; + } + }, + splitJoin(value, { method }) { + if (method == "bind") { + return isString(value) ? value.split(",").filter(Boolean) : value; + } else { + return isArray(value) ? value.join(",") : value; + } + }, + json(value, { method }) { + if (method == "bind") { + try { + return JSON.parse(value); + } catch (e) { + return {}; + } + } else { + return JSON.stringify(value); + } + }, + empty(value) { + if (isString(value)) { + return value === "" ? undefined : value; + } + + if (isArray(value)) { + return isEmpty(value) ? undefined : value; + } + + return value; + } +}; + +function init({ value, form, prop }: any) { + if (prop) { + const [a, b] = prop.split("-"); + if (b) { + form[prop] = form[a] ? form[a][b] : form[a]; + } else { + form[prop] = value; + } + } +} + +function parse(method: "submit" | "bind", { value, hook: pipe, form, prop }: any) { + init({ value, method, form, prop }); + + if (!pipe) { + return false; + } + + let pipes: any[] = []; + + if (isString(pipe)) { + if (format[pipe]) { + pipes = [pipe]; + } else { + console.error(`[hook] ${pipe} is not found`); + } + } else if (isArray(pipe)) { + pipes = pipe; + } else if (isObject(pipe)) { + pipes = isArray(pipe[method]) ? pipe[method] : [pipe[method]]; + } else if (isFunction(pipe)) { + pipes = [pipe]; + } else { + console.error(`[hook] ${pipe} format error`); + } + + let v = value; + + pipes.forEach((e) => { + let f: any = null; + + if (isString(e)) { + f = format[e]; + } else if (isFunction(e)) { + f = e; + } + + if (f) { + v = f(v, { + method, + form, + prop + }); + } + }); + + if (prop) { + form[prop] = v; + } +} + +const formHook = { + bind(data: any) { + parse("bind", data); + }, + + submit(data: any) { + parse("submit", data); + } +}; + +export function registerFormHook(name: string, fn: ClForm.Hook["Fn"]) { + format[name] = fn; +} + +export default formHook; diff --git a/packages/crud/src/utils/global.ts b/packages/crud/src/utils/global.ts new file mode 100644 index 0000000..83b7b0b --- /dev/null +++ b/packages/crud/src/utils/global.ts @@ -0,0 +1,16 @@ +// @ts-nocheck +import { type App } from "vue"; + +export default { + get vue(): App { + return window.__CrudApp__; + }, + + get(key: string) { + return window[key]; + }, + + set(key: string, value: any) { + window[key] = value; + } +}; diff --git a/packages/crud/src/utils/index.ts b/packages/crud/src/utils/index.ts new file mode 100644 index 0000000..05ae097 --- /dev/null +++ b/packages/crud/src/utils/index.ts @@ -0,0 +1,164 @@ +import { isRef, mergeProps, toValue } from "vue"; +import { assign, flatMap, isArray, isFunction, isNumber, mergeWith } from "lodash-es"; + +// 是否对象 +export function isObject(val: any) { + return val !== null && typeof val === "object"; +} + +// 解析px +export function parsePx(val: string | number) { + return isNumber(val) ? `${val}px` : val; +} + +// 数据设置 +export function dataset(obj: any, key: string, value: any): any { + const isGet = value === undefined; + let d = obj; + + const arr = flatMap( + key.split(".").map((e) => { + if (e.includes("[")) { + return e.split("[").map((e) => e.replace(/"/g, "")); + } else { + return e; + } + }) + ); + + try { + for (let i = 0; i < arr.length; i++) { + const e: any = arr[i]; + let n: any = null; + + if (e.includes("]")) { + const [k, v] = e.replace("]", "").split(":"); + + if (v) { + n = d.findIndex((x: any) => x[k] == v); + } else { + n = Number(k); + } + } else { + n = e; + } + + if (i != arr.length - 1) { + d = d[n]; + } else { + if (isGet) { + return d[n]; + } else { + if (isObject(value)) { + assign(d[n], value); + } else { + d[n] = value; + } + } + } + } + + return obj; + } catch (e) { + console.error("[dataset] format error", `${key}`); + return {}; + } +} + +// 元素是否包含 +export function contains(parent: any, node: any) { + return parent !== node && parent && parent.contains(node); +} + +// 合并配置 +export function mergeConfig(a: any, b?: any): any { + return b ? mergeProps(a, b) : a; +} + +// 合并数据 +export function merge(d1: any, d2: any) { + return mergeWith(d1, d2, (_, b) => { + if (isArray(b)) { + return b; + } + }); +} + +// 添加元素 +export function addClass(el: Element, name: string) { + if (el?.classList) { + el.classList.add(name); + } +} + +// 移除元素 +export function removeClass(el: Element, name: string) { + if (el?.classList) { + el.classList.remove(name); + } +} + +// 获取值 +export function getValue(value: T | Vue.Ref | ((d: any) => T), data?: any): T { + if (isRef(value)) { + return toValue(value) as T; + } else { + if (isFunction(value)) { + return value(data); + } else { + return value as T; + } + } +} + +// 深度查找 +export function deepFind(value: any, list: any[], options?: { allLevels: boolean }) { + const { allLevels = true } = options || {}; + + function deep(arr: DictOptions, name: string[]): any | undefined { + for (const e of arr) { + if (e.value === value) { + if (allLevels) { + return { + ...e, + label: [...name, e.label].join(" / ") + }; + } else { + return e; + } + } else if (e.children) { + const d = deep(e.children, [...name!, e.label!]); + + if (d !== undefined) { + return d; + } + } + } + return undefined; + } + + return deep(list, []); +} + +// uuid +export function uuid(separator = "-"): string { + const s: any[] = []; + const hexDigits = "0123456789abcdef"; + for (let i = 0; i < 36; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); + } + s[14] = "4"; + s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); + s[8] = s[13] = s[18] = s[23] = separator; + + return s.join(""); +} + +// 移除相同的方法 +export function uniqueFns(fns: any[]) { + const arr = new Map(); + fns.forEach((fn) => { + arr.set(fn.name, fn); + }); + return Array.from(arr.values()); +} diff --git a/packages/crud/src/utils/mitt.ts b/packages/crud/src/utils/mitt.ts new file mode 100644 index 0000000..b79cedb --- /dev/null +++ b/packages/crud/src/utils/mitt.ts @@ -0,0 +1,30 @@ +import _mitt from "mitt"; + +const mitt = _mitt(); + +class Mitt { + id: number; + + constructor(id?: number) { + this.id = id || 0; + } + + send(type: "emit" | "off" | "on", name: string, ...args: any[]) { + // @ts-expect-error + mitt[type](`${this.id}__${name}`, ...args); + } + + emit(name: string, ...args: any[]) { + this.send("emit", name, ...args); + } + + off(name: string, handler: (...args: any[]) => void) { + this.send("off", name, handler); + } + + on(name: string, handler: (...args: any[]) => void) { + this.send("on", name, handler); + } +} + +export { Mitt, mitt }; diff --git a/packages/crud/src/utils/parse.tsx b/packages/crud/src/utils/parse.tsx new file mode 100644 index 0000000..404ccbb --- /dev/null +++ b/packages/crud/src/utils/parse.tsx @@ -0,0 +1,52 @@ +import { isString } from "lodash-es"; +import { getValue, isObject } from "."; + +// 解析扩展组件 +export function parseExtensionComponent(vnode: Render.Component) { + if (["el-select", "el-radio-group", "el-checkbox-group"].includes(vnode.name!)) { + const list = getValue(vnode.options || []); + + const children = ( +
+ {list.map((e, i) => { + let label: any; + let value: any; + + if (isString(e)) { + label = value = e; + } else if (isObject(e)) { + label = e.label; + value = e.value; + } else { + return ; + } + + switch (vnode.name) { + case "el-select": + return ; + case "el-radio-group": + return ( + + {label} + + ); + case "el-checkbox-group": + return ( + + {label} + + ); + default: + return null; + } + })} +
+ ); + + return { + children + }; + } else { + return {}; + } +} diff --git a/packages/crud/src/utils/vnode.tsx b/packages/crud/src/utils/vnode.tsx new file mode 100644 index 0000000..e213eb1 --- /dev/null +++ b/packages/crud/src/utils/vnode.tsx @@ -0,0 +1,182 @@ +import { h, resolveComponent, toRaw, type VNode } from "vue"; +import { isObject } from "./index"; +import { parseExtensionComponent } from "./parse"; +import global from "./global"; +import { useConfig } from "../hooks"; +import { isFunction, isString } from "lodash-es"; + +// 配置 +interface Options { + // 标识 + prop?: string; + // 数据值 + scope?: any; + // 当前行 + item?: any; + // 插槽 + slots?: any; + // 子集 + children?: any[] & any; + // 自定义 + custom?: (vnode: any) => any; + // 渲染方式 + render?: "slot" | null; + // 其他 + [key: string]: any; +} + +// 临时注册组件列表 +const regs: Map = new Map(); + +// 解析节点 +export function parseNode(vnode: any, options: Options): VNode { + const { scope, prop, slots, children, _data } = options || {}; + + // 渲染后组件 + let comp: VNode | null = null; + + // 插槽模式渲染 + if (vnode.name?.includes("slot-")) { + const rn = slots[vnode.name]; + + if (rn) { + return rn({ scope, prop, ..._data }); + } else { + return ; + } + } + + // 实例模式下,先注册到全局,再分解组件渲染 + if (vnode.vm && !regs.get(vnode.name)) { + global.vue.component(vnode.name, { ...vnode.vm }); + regs.set(vnode.name, { ...vnode.vm }); + } + + // 处理 props + if (isFunction(vnode.props)) { + vnode.props = vnode.props({ scope, prop, ..._data }); + } + + // 组件参数 + const props = { + ...vnode.props, + ..._data, + prop, + scope + }; + + // 是否禁用 + props.disabled = _data?.isDisabled || props.disabled; + + // 添加双向绑定 + if (props && scope) { + if (prop) { + props.modelValue = scope[prop]; + props["onUpdate:modelValue"] = function (val: any) { + scope[prop] = val; + }; + } + } + + // 组件实例渲染 + if (vnode.vm) { + comp = h(regs.get(vnode.name), props); + } else { + const slots = { + ...vnode.slots + }; + + if (children) { + slots.default = () => children; + } + + // 渲染组件 + comp = h(toRaw(resolveComponent(vnode.name)), props, slots); + } + + // 挂载到 refs 中 + const refBind = vnode.ref || options.ref; + if (isFunction(refBind)) { + setTimeout(() => { + refBind(comp?.component?.exposed); + }, 0); + } + + return comp; +} + +// 渲染节点 +export function renderNode(vnode: any, options: Options) { + const config = useConfig(); + const { item, scope, children, _data, render } = options || {}; + + if (!vnode) { + return null; + } + + if (vnode.__v_isVNode) { + return vnode; + } + + // 默认参数配置 + if (item) { + if (item.component) { + if (!item.component.props) { + item.component.props = {}; + } + + // 占位符 + let placeholder = ""; + + switch (item.component?.name) { + case "el-input": + placeholder = config.dict.label.placeholder; + break; + } + + if (placeholder) { + if (!item.component.props.placeholder) { + item.component.props.placeholder = placeholder; + } + } + } + } + + // 组件实例 + if (vnode.vm) { + if (!vnode.name) { + vnode.name = vnode.vm?.name || vnode.vm?.__hmrId; + } + + return parseNode(vnode, options); + } + + // 组件名渲染 + if (isString(vnode)) { + if (render == "slot") { + if (!vnode.includes("slot-")) { + return vnode; + } + } + + return parseNode({ name: vnode }, options); + } + + // 方法回调 + if (isFunction(vnode)) { + return vnode({ scope, h, ..._data }); + } + + // jsx 模式 + if (isObject(vnode)) { + if (vnode.name) { + return parseNode(vnode, { ...options, children, ...parseExtensionComponent(vnode) }); + } else { + if (options.custom) { + return options.custom(vnode); + } + + return ; + } + } +} diff --git a/packages/crud/tsconfig.json b/packages/crud/tsconfig.json new file mode 100644 index 0000000..75d48c2 --- /dev/null +++ b/packages/crud/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "strict": false, + "noImplicitAny": false, + + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "types": ["./index.d.ts"], + + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "declaration": true, + "declarationDir": "types", + "emitDeclarationOnly": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "exclude": ["src/App.vue", "node_modules", "dist"] +} diff --git a/packages/crud/types/components/add-btn/index.d.ts b/packages/crud/types/components/add-btn/index.d.ts new file mode 100644 index 0000000..29d4988 --- /dev/null +++ b/packages/crud/types/components/add-btn/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: import('vue').DefineComponent<{}, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/adv/btn.d.ts b/packages/crud/types/components/adv/btn.d.ts new file mode 100644 index 0000000..5091404 --- /dev/null +++ b/packages/crud/types/components/adv/btn.d.ts @@ -0,0 +1,4 @@ +declare const _default: import('vue').DefineComponent<{}, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, { + Search: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/adv/search.d.ts b/packages/crud/types/components/adv/search.d.ts new file mode 100644 index 0000000..7792c7d --- /dev/null +++ b/packages/crud/types/components/adv/search.d.ts @@ -0,0 +1,42 @@ +import { PropType } from 'vue'; +declare const _default: import('vue').DefineComponent; + default: () => any[]; + }; + title: StringConstructor; + size: { + type: (NumberConstructor | StringConstructor)[]; + default: string; + }; + op: { + type: ArrayConstructor; + default: () => string[]; + }; + onSearch: FunctionConstructor; +}>, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("clear" | "reset")[], "clear" | "reset", import('vue').PublicProps, Readonly; + default: () => any[]; + }; + title: StringConstructor; + size: { + type: (NumberConstructor | StringConstructor)[]; + default: string; + }; + op: { + type: ArrayConstructor; + default: () => string[]; + }; + onSearch: FunctionConstructor; +}>> & Readonly<{ + onReset?: (...args: any[]) => any; + onClear?: (...args: any[]) => any; +}>, { + size: string | number; + items: ClForm.Item[]; + op: unknown[]; +}, {}, { + Close: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/context-menu/index.d.ts b/packages/crud/types/components/context-menu/index.d.ts new file mode 100644 index 0000000..20e5af1 --- /dev/null +++ b/packages/crud/types/components/context-menu/index.d.ts @@ -0,0 +1,30 @@ +import { PropType } from 'vue'; +declare const ClContextMenu: import('vue').DefineComponent; + default: () => {}; + }; + event: { + type: ObjectConstructor; + default: () => {}; + }; +}>, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly; + default: () => {}; + }; + event: { + type: ObjectConstructor; + default: () => {}; + }; +}>> & Readonly<{}>, { + options: ClContextMenu.Options; + show: boolean; + event: Record; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export declare const ContextMenu: { + open(event: any, options: ClContextMenu.Options): ClContextMenu.Exposed; +}; +export default ClContextMenu; diff --git a/packages/crud/types/components/crud/helper.d.ts b/packages/crud/types/components/crud/helper.d.ts new file mode 100644 index 0000000..04d46e6 --- /dev/null +++ b/packages/crud/types/components/crud/helper.d.ts @@ -0,0 +1,23 @@ +import { Mitt } from '../../utils/mitt'; +interface Options { + mitt: Mitt; + config: ClCrud.Config; + crud: ClCrud.Ref; +} +export declare function useHelper({ config, crud, mitt }: Options): { + proxy: (name: string, data?: any[]) => void; + set: (key: string, value: any) => boolean; + on: (name: string, callback: fn) => void; + rowInfo: (data: any) => void; + rowAdd: () => void; + rowEdit: (data: any) => void; + rowAppend: (data: any) => void; + rowDelete: (...selection: any[]) => void; + rowClose: () => void; + refresh: (params?: obj) => Promise; + getPermission: (key: "page" | "list" | "info" | "update" | "add" | "delete") => boolean; + paramsReplace: (params: obj) => any; + getParams: () => obj; + setParams: (data: obj) => void; +}; +export {}; diff --git a/packages/crud/types/components/crud/index.d.ts b/packages/crud/types/components/crud/index.d.ts new file mode 100644 index 0000000..93e8de9 --- /dev/null +++ b/packages/crud/types/components/crud/index.d.ts @@ -0,0 +1,19 @@ +declare const _default: import('vue').DefineComponent, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly> & Readonly<{}>, { + border: boolean; + padding: string; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/dialog/index.d.ts b/packages/crud/types/components/dialog/index.d.ts new file mode 100644 index 0000000..6482060 --- /dev/null +++ b/packages/crud/types/components/dialog/index.d.ts @@ -0,0 +1,86 @@ +declare const _default: import('vue').DefineComponent string[]; + }; + hideHeader: BooleanConstructor; + beforeClose: FunctionConstructor; + scrollbar: { + type: BooleanConstructor; + default: boolean; + }; + transparent: BooleanConstructor; +}>, () => import('vue').VNode, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("update:modelValue" | "fullscreen-change")[], "update:modelValue" | "fullscreen-change", import('vue').PublicProps, Readonly string[]; + }; + hideHeader: BooleanConstructor; + beforeClose: FunctionConstructor; + scrollbar: { + type: BooleanConstructor; + default: boolean; + }; + transparent: BooleanConstructor; +}>> & Readonly<{ + "onUpdate:modelValue"?: (...args: any[]) => any; + "onFullscreen-change"?: (...args: any[]) => any; +}>, { + title: string; + padding: string; + width: string; + hideHeader: boolean; + controls: unknown[]; + fullscreen: boolean; + keepAlive: boolean; + modelValue: boolean; + transparent: boolean; + scrollbar: boolean; +}, {}, { + Close: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; + FullScreen: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; + Minus: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/error-message/index.d.ts b/packages/crud/types/components/error-message/index.d.ts new file mode 100644 index 0000000..bcc538c --- /dev/null +++ b/packages/crud/types/components/error-message/index.d.ts @@ -0,0 +1,6 @@ +declare const _default: import('vue').DefineComponent, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/filter/index.d.ts b/packages/crud/types/components/filter/index.d.ts new file mode 100644 index 0000000..bb8f8c6 --- /dev/null +++ b/packages/crud/types/components/filter/index.d.ts @@ -0,0 +1,6 @@ +declare const _default: import('vue').DefineComponent, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/flex1/index.d.ts b/packages/crud/types/components/flex1/index.d.ts new file mode 100644 index 0000000..29d4988 --- /dev/null +++ b/packages/crud/types/components/flex1/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: import('vue').DefineComponent<{}, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/form-card/index.d.ts b/packages/crud/types/components/form-card/index.d.ts new file mode 100644 index 0000000..8c93df5 --- /dev/null +++ b/packages/crud/types/components/form-card/index.d.ts @@ -0,0 +1,28 @@ +declare const _default: import('vue').DefineComponent, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly> & Readonly<{}>, { + expand: boolean; + isExpand: boolean; +}, {}, { + ArrowDown: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; + ArrowUp: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/form-tabs/index.d.ts b/packages/crud/types/components/form-tabs/index.d.ts new file mode 100644 index 0000000..429a6d7 --- /dev/null +++ b/packages/crud/types/components/form-tabs/index.d.ts @@ -0,0 +1,38 @@ +import { PropType } from 'vue'; +declare const _default: import('vue').DefineComponent any[]; + }; + justify: { + type: PropType<"start" | "end" | "left" | "right" | "center" | "justify" | "match-parent">; + default: string; + }; + type: { + type: PropType<"card" | "default">; + default: string; + }; +}>, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("change" | "update:modelValue")[], "change" | "update:modelValue", import('vue').PublicProps, Readonly any[]; + }; + justify: { + type: PropType<"start" | "end" | "left" | "right" | "center" | "justify" | "match-parent">; + default: string; + }; + type: { + type: PropType<"card" | "default">; + default: string; + }; +}>> & Readonly<{ + onChange?: (...args: any[]) => any; + "onUpdate:modelValue"?: (...args: any[]) => any; +}>, { + type: "default" | "card"; + labels: unknown[]; + justify: "left" | "center" | "right" | "justify" | "start" | "end" | "match-parent"; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/form/helper/action.d.ts b/packages/crud/types/components/form/helper/action.d.ts new file mode 100644 index 0000000..fef6a4d --- /dev/null +++ b/packages/crud/types/components/form/helper/action.d.ts @@ -0,0 +1,17 @@ +export declare function useAction({ config, form, Form }: { + config: ClForm.Config; + form: obj; + Form: Vue.Ref; +}): { + getForm: (prop: string) => any; + setForm: (prop: string, value: any) => void; + setData: (prop: string, value: any) => void; + setConfig: (path: string, value: any) => void; + setOptions: (prop: string, value: any[]) => void; + setProps: (prop: string, value: any) => void; + toggleItem: (prop: string, value?: boolean) => void; + hideItem: (...props: string[]) => void; + showItem: (...props: string[]) => void; + setTitle: (value: string) => void; + collapseItem: (e: any) => void; +}; diff --git a/packages/crud/types/components/form/helper/api.d.ts b/packages/crud/types/components/form/helper/api.d.ts new file mode 100644 index 0000000..ea4f483 --- /dev/null +++ b/packages/crud/types/components/form/helper/api.d.ts @@ -0,0 +1,3 @@ +export declare function useApi({ Form }: { + Form: Vue.Ref; +}): obj; diff --git a/packages/crud/types/components/form/helper/index.d.ts b/packages/crud/types/components/form/helper/index.d.ts new file mode 100644 index 0000000..a6ae9b9 --- /dev/null +++ b/packages/crud/types/components/form/helper/index.d.ts @@ -0,0 +1,237 @@ +export declare function useForm(): { + Form: import('vue').Ref; + config: { + [x: string]: any; + title?: any; + height?: any; + width?: any; + props: { + [x: string]: any; + inline?: boolean; + labelPosition?: "left" | "right" | "top"; + labelWidth?: string | number; + labelSuffix?: string; + hideRequiredAsterisk?: boolean; + showMessage?: boolean; + inlineMessage?: boolean; + statusIcon?: boolean; + validateOnRuleChange?: boolean; + size?: ElementPlus.Size; + disabled?: boolean; + }; + items: { + [x: string]: any; + type?: "tabs"; + prop?: string & {}; + props?: { + [x: string]: any; + labels?: { + [x: string]: any; + label: string; + value: string; + name?: string; + icon?: any; + lazy?: boolean; + }[]; + justify?: "left" | "center" | "right"; + color?: string; + mergeProp?: boolean; + labelWidth?: string; + error?: string; + showMessage?: boolean; + inlineMessage?: boolean; + size?: "medium" | "default" | "small"; + }; + span?: number; + col?: { + span: number; + offset: number; + push: number; + pull: number; + xs: any; + sm: any; + md: any; + lg: any; + xl: any; + tag: string; + }; + group?: string; + collapse?: boolean; + value?: any; + label?: string; + renderLabel?: any; + flex?: boolean; + hook?: "string" | "number" | "boolean" | "join" | "split" | AnyString | "empty" | "booleanNumber" | "datetimeRange" | "splitJoin" | "json" | { + bind?: ClForm.Hook["Pipe"] | ClForm.Hook["Pipe"][]; + submit?: ClForm.Hook["Pipe"] | ClForm.Hook["Pipe"][]; + reset?: (prop: string) => string[]; + }; + hidden?: boolean | ((options: { + scope: obj; + }) => boolean); + prepend?: { + [x: string]: any; + name?: string; + options?: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[] | { + value: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[]; + }; + props?: { + [x: string]: any; + onChange?: (value: any) => void; + } | { + value: { + [x: string]: any; + onChange?: (value: any) => void; + }; + }; + style?: obj; + slots?: { + [key: string]: (data?: any) => any; + }; + vm?: any; + }; + component?: { + [x: string]: any; + name?: string; + options?: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[] | { + value: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[]; + }; + props?: { + [x: string]: any; + onChange?: (value: any) => void; + } | { + value: { + [x: string]: any; + onChange?: (value: any) => void; + }; + }; + style?: obj; + slots?: { + [key: string]: (data?: any) => any; + }; + vm?: any; + }; + append?: { + [x: string]: any; + name?: string; + options?: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[] | { + value: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[]; + }; + props?: { + [x: string]: any; + onChange?: (value: any) => void; + } | { + value: { + [x: string]: any; + onChange?: (value: any) => void; + }; + }; + style?: obj; + slots?: { + [key: string]: (data?: any) => any; + }; + vm?: any; + }; + rules?: { + [x: string]: any; + type?: "string" | "number" | "boolean" | "method" | "regexp" | "integer" | "float" | "array" | "object" | "enum" | "date" | "url" | "hex" | "email" | "any"; + required?: boolean; + message?: string; + min?: number; + max?: number; + trigger?: any; + validator?: (rule: any, value: any, callback: (error?: Error) => void) => void; + } | { + [x: string]: any; + type?: "string" | "number" | "boolean" | "method" | "regexp" | "integer" | "float" | "array" | "object" | "enum" | "date" | "url" | "hex" | "email" | "any"; + required?: boolean; + message?: string; + min?: number; + max?: number; + trigger?: any; + validator?: (rule: any, value: any, callback: (error?: Error) => void) => void; + }[]; + required?: boolean; + children?: /*elided*/ any[]; + }[]; + form: obj; + isReset?: boolean; + on?: { + open?: (data: any) => void; + close?: (action: ClForm.CloseAction, done: fn) => void; + submit?: (data: any, event: { + close: fn; + done: fn; + }) => void; + change?: (data: any, prop: string) => void; + }; + op: { + hidden?: boolean; + saveButtonText?: string; + closeButtonText?: string; + justify?: "flex-start" | "center" | "flex-end"; + buttons?: (`slot-${string}` | ClForm.CloseAction | { + [x: string]: any; + label: string; + type?: string; + hidden?: boolean; + onClick: (options: { + scope: obj; + }) => void; + })[]; + }; + dialog: { + [x: string]: any; + title?: any; + height?: string; + width?: string; + hideHeader?: boolean; + controls?: Array<"fullscreen" | "close" | AnyString>; + }; + }; + form: obj; + visible: import('vue').Ref; + saving: import('vue').Ref; + loading: import('vue').Ref; + disabled: import('vue').Ref; +}; +export * from './action'; +export * from './api'; +export * from './plugins'; +export * from './tabs'; diff --git a/packages/crud/types/components/form/helper/plugins.d.ts b/packages/crud/types/components/form/helper/plugins.d.ts new file mode 100644 index 0000000..6811d5d --- /dev/null +++ b/packages/crud/types/components/form/helper/plugins.d.ts @@ -0,0 +1,7 @@ +import { Ref } from 'vue'; +export declare function usePlugins(enable: boolean, { visible }: { + visible: Ref; +}): { + create: (plugins?: ClForm.Plugin[]) => boolean; + submit: (data: any) => Promise; +}; diff --git a/packages/crud/types/components/form/helper/tabs.d.ts b/packages/crud/types/components/form/helper/tabs.d.ts new file mode 100644 index 0000000..f1c24a6 --- /dev/null +++ b/packages/crud/types/components/form/helper/tabs.d.ts @@ -0,0 +1,19 @@ +export declare function useTabs({ config, Form }: { + config: ClForm.Config; + Form: Vue.Ref; +}): { + active: import('vue').Ref; + list: import('vue').ComputedRef; + isLoaded: (value: any) => any; + onLoad: (value: any) => void; + get: () => ClForm.Item; + set: (data: any) => void; + change: (value: any, isValid?: boolean) => Promise; + clear: () => void; + mergeProp: (item: ClForm.Item) => void; + toGroup: (opts: { + config: ClForm.Config; + prop: string; + refs: any; + }) => void; +}; diff --git a/packages/crud/types/components/form/index.d.ts b/packages/crud/types/components/form/index.d.ts new file mode 100644 index 0000000..a006771 --- /dev/null +++ b/packages/crud/types/components/form/index.d.ts @@ -0,0 +1,22 @@ +declare const _default: import('vue').DefineComponent, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly> & Readonly<{}>, { + inline: boolean; + inner: boolean; + enablePlugin: boolean; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/index.d.ts b/packages/crud/types/components/index.d.ts new file mode 100644 index 0000000..e648ab0 --- /dev/null +++ b/packages/crud/types/components/index.d.ts @@ -0,0 +1,5 @@ +import { App } from 'vue'; +export declare const components: { + [key: string]: any; +}; +export declare function useComponent(app: App): void; diff --git a/packages/crud/types/components/multi-delete-btn/index.d.ts b/packages/crud/types/components/multi-delete-btn/index.d.ts new file mode 100644 index 0000000..29d4988 --- /dev/null +++ b/packages/crud/types/components/multi-delete-btn/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: import('vue').DefineComponent<{}, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/pagination/index.d.ts b/packages/crud/types/components/pagination/index.d.ts new file mode 100644 index 0000000..b82693a --- /dev/null +++ b/packages/crud/types/components/pagination/index.d.ts @@ -0,0 +1,4 @@ +declare const _default: import('vue').DefineComponent<{}, () => import('vue').VNode, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/refresh-btn/index.d.ts b/packages/crud/types/components/refresh-btn/index.d.ts new file mode 100644 index 0000000..29d4988 --- /dev/null +++ b/packages/crud/types/components/refresh-btn/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: import('vue').DefineComponent<{}, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/row/index.d.ts b/packages/crud/types/components/row/index.d.ts new file mode 100644 index 0000000..29d4988 --- /dev/null +++ b/packages/crud/types/components/row/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: import('vue').DefineComponent<{}, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/search-key/index.d.ts b/packages/crud/types/components/search-key/index.d.ts new file mode 100644 index 0000000..47a2bbc --- /dev/null +++ b/packages/crud/types/components/search-key/index.d.ts @@ -0,0 +1,55 @@ +import { PropType } from 'vue'; +declare const _default: import('vue').DefineComponent>; + default: () => any[]; + }; + onSearch: FunctionConstructor; + placeholder: StringConstructor; + width: { + type: (NumberConstructor | StringConstructor)[]; + default: number; + }; + refreshOnInput: BooleanConstructor; +}>, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("change" | "update:modelValue" | "field-change")[], "change" | "update:modelValue" | "field-change", import('vue').PublicProps, Readonly>; + default: () => any[]; + }; + onSearch: FunctionConstructor; + placeholder: StringConstructor; + width: { + type: (NumberConstructor | StringConstructor)[]; + default: number; + }; + refreshOnInput: BooleanConstructor; +}>> & Readonly<{ + onChange?: (...args: any[]) => any; + "onUpdate:modelValue"?: (...args: any[]) => any; + "onField-change"?: (...args: any[]) => any; +}>, { + width: string | number; + refreshOnInput: boolean; + field: string; + fieldList: { + label: string; + value: string; + }[]; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/search/helper/plugins.d.ts b/packages/crud/types/components/search/helper/plugins.d.ts new file mode 100644 index 0000000..7d1138c --- /dev/null +++ b/packages/crud/types/components/search/helper/plugins.d.ts @@ -0,0 +1,3 @@ +export declare function usePlugins(): { + create: (plugins?: ClSearch.Plugin[]) => void; +}; diff --git a/packages/crud/types/components/search/index.d.ts b/packages/crud/types/components/search/index.d.ts new file mode 100644 index 0000000..17ba12a --- /dev/null +++ b/packages/crud/types/components/search/index.d.ts @@ -0,0 +1,66 @@ +import { PropType } from 'vue'; +declare const _default: import('vue').DefineComponent {}; + }; + data: { + type: ObjectConstructor; + default: () => {}; + }; + items: { + type: PropType; + default: () => any[]; + }; + resetBtn: { + type: BooleanConstructor; + default: boolean; + }; + collapse: { + type: BooleanConstructor; + default: boolean; + }; + onLoad: FunctionConstructor; + onSearch: FunctionConstructor; +}>, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, "reset"[], "reset", import('vue').PublicProps, Readonly {}; + }; + data: { + type: ObjectConstructor; + default: () => {}; + }; + items: { + type: PropType; + default: () => any[]; + }; + resetBtn: { + type: BooleanConstructor; + default: boolean; + }; + collapse: { + type: BooleanConstructor; + default: boolean; + }; + onLoad: FunctionConstructor; + onSearch: FunctionConstructor; +}>> & Readonly<{ + onReset?: (...args: any[]) => any; +}>, { + data: Record; + props: Record; + items: ClForm.Item[]; + inline: boolean; + resetBtn: boolean; + collapse: boolean; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/table/helper/data.d.ts b/packages/crud/types/components/table/helper/data.d.ts new file mode 100644 index 0000000..932629f --- /dev/null +++ b/packages/crud/types/components/table/helper/data.d.ts @@ -0,0 +1,7 @@ +export declare function useData({ config, Table }: { + config: ClTable.Config; + Table: Vue.Ref; +}): { + data: import('vue').Ref; + setData: (list: obj[]) => void; +}; diff --git a/packages/crud/types/components/table/helper/header.d.ts b/packages/crud/types/components/table/helper/header.d.ts new file mode 100644 index 0000000..0b4bd8b --- /dev/null +++ b/packages/crud/types/components/table/helper/header.d.ts @@ -0,0 +1 @@ +export declare function renderHeader(item: ClTable.Column, { scope, slots }: any): any; diff --git a/packages/crud/types/components/table/helper/height.d.ts b/packages/crud/types/components/table/helper/height.d.ts new file mode 100644 index 0000000..12d050a --- /dev/null +++ b/packages/crud/types/components/table/helper/height.d.ts @@ -0,0 +1,7 @@ +export declare function useHeight({ config, Table }: { + Table: Vue.Ref; + config: ClTable.Config; +}): { + maxHeight: import('vue').Ref; + calcMaxHeight: import('lodash').DebouncedFunc<() => Promise>; +}; diff --git a/packages/crud/types/components/table/helper/index.d.ts b/packages/crud/types/components/table/helper/index.d.ts new file mode 100644 index 0000000..cee1073 --- /dev/null +++ b/packages/crud/types/components/table/helper/index.d.ts @@ -0,0 +1,191 @@ +import { TableInstance } from 'element-plus'; +export declare function useTable(props: any): { + Table: import('vue').Ref; + config: { + columns: { + [x: string]: any; + type: ClTable.ColumnType; + hidden: boolean | { + value: boolean; + }; + component: { + [x: string]: any; + name?: string; + options?: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[] | { + value: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[]; + }; + props?: { + [x: string]: any; + onChange?: (value: any) => void; + } | { + value: { + [x: string]: any; + onChange?: (value: any) => void; + }; + }; + style?: obj; + slots?: { + [key: string]: (data?: any) => any; + }; + vm?: any; + }; + search: { + isInput: boolean; + value: any; + icon: () => any; + refreshOnChange: boolean; + component: { + [x: string]: any; + name?: string; + options?: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[] | { + value: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[]; + }; + props?: { + [x: string]: any; + onChange?: (value: any) => void; + } | { + value: { + [x: string]: any; + onChange?: (value: any) => void; + }; + }; + style?: obj; + slots?: { + [key: string]: (data?: any) => any; + }; + vm?: any; + }; + }; + dict: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[] | { + value: { + [x: string]: any; + label?: string; + value?: any; + color?: string; + type?: string; + }[]; + }; + dictFormatter: (values: DictOptions) => string; + dictColor: boolean; + dictSeparator: string; + dictAllLevels: boolean; + buttons: ((options: { + scope: any; + }) => ClTable.OpButton) | ("info" | "delete" | "edit" | AnyString | `slot-${string}` | { + [x: string]: any; + label: string; + type?: string; + hidden?: boolean; + onClick: (options: { + scope: obj; + }) => void; + })[]; + align: ElementPlus.Align; + label: any; + renderLabel: (options: { + column: any; + $index: number; + }) => any; + className: string; + prop: string & {}; + orderNum: number; + width: string | number | { + value: string | number; + }; + minWidth: string | number | { + value: string | number; + }; + renderHeader: (options: { + column: any; + $index: number; + }) => any; + sortable: boolean | "desc" | "descending" | "ascending" | "asc" | "custom"; + sortMethod: fn; + sortBy: string | any[] | ((row: any, index: number) => any); + resizable: boolean; + columnKey: string; + headerAlign: ElementPlus.Align; + showOverflowTooltip: boolean; + fixed: boolean | string; + render: (row: any, column: any, value: any, index: number) => any; + formatter: (row: any, column: any, value: any, index: number) => any; + selectable: (row: any, index: number) => boolean; + reserveSelection: boolean; + filterMethod: fn; + filteredValue: unknown[]; + filters: unknown[]; + filterPlacement: string; + filterMultiple: boolean; + index: ((index: number) => number) | number; + sortOrders: unknown[]; + children: /*elided*/ any[]; + }[]; + autoHeight: boolean; + height: any; + contextMenu: ("info" | "update" | "delete" | "edit" | "refresh" | { + [x: string]: any; + label: string; + prefixIcon?: any; + suffixIcon?: any; + ellipsis?: boolean; + disabled?: boolean; + hidden?: boolean; + children?: /*elided*/ any[]; + showChildren?: boolean; + callback?: (done: fn) => void; + } | ((row: obj, column: obj, event: PointerEvent) => ClContextMenu.Item) | "check" | "order-desc" | "order-asc")[]; + defaultSort: { + prop: string; + order: "descending" | "ascending"; + }; + sortRefresh: boolean; + emptyText: string; + rowKey: string; + on?: { + [key: string]: (...args: any[]) => void; + }; + props?: { + [key: string]: any; + }; + plugins?: ClTable.Plugin[]; + onRowContextmenu?: (row: any, column: any, event: any) => void; + }; +}; +export * from './data'; +export * from './height'; +export * from './op'; +export * from './render'; +export * from './row'; +export * from './selection'; +export * from './sort'; +export * from './header'; diff --git a/packages/crud/types/components/table/helper/op.d.ts b/packages/crud/types/components/table/helper/op.d.ts new file mode 100644 index 0000000..6e8a7a7 --- /dev/null +++ b/packages/crud/types/components/table/helper/op.d.ts @@ -0,0 +1,9 @@ +export declare function useOp({ config }: { + config: ClTable.Config; +}): { + visible: import('vue').Ref; + reBuild: (cb?: fn) => Promise; + showColumn: (prop: string | string[], status?: boolean) => void; + hideColumn: (prop: string | string[]) => void; + setColumns: (list: ClTable.Column[]) => void; +}; diff --git a/packages/crud/types/components/table/helper/plugins.d.ts b/packages/crud/types/components/table/helper/plugins.d.ts new file mode 100644 index 0000000..5e94af8 --- /dev/null +++ b/packages/crud/types/components/table/helper/plugins.d.ts @@ -0,0 +1,3 @@ +export declare function usePlugins(): { + create: (plugins?: ClTable.Plugin[]) => void; +}; diff --git a/packages/crud/types/components/table/helper/render.d.ts b/packages/crud/types/components/table/helper/render.d.ts new file mode 100644 index 0000000..226bd5e --- /dev/null +++ b/packages/crud/types/components/table/helper/render.d.ts @@ -0,0 +1,7 @@ +export declare function useRender(): { + renderColumn: (columns: ClTable.Column[]) => import('vue').VNode[]; + renderEmpty: (emptyText: string) => any; + renderAppend: () => any; +}; diff --git a/packages/crud/types/components/table/helper/row.d.ts b/packages/crud/types/components/table/helper/row.d.ts new file mode 100644 index 0000000..1b70cad --- /dev/null +++ b/packages/crud/types/components/table/helper/row.d.ts @@ -0,0 +1,13 @@ +export declare function useRow({ Table, config, Sort }: { + Table: Vue.Ref; + config: ClTable.Config; + Sort: { + defaultSort: { + prop?: string; + order?: string; + }; + changeSort(prop: string, order: string): void; + }; +}): { + onRowContextMenu: (row: obj, column: obj, event: PointerEvent) => void; +}; diff --git a/packages/crud/types/components/table/helper/selection.d.ts b/packages/crud/types/components/table/helper/selection.d.ts new file mode 100644 index 0000000..568a302 --- /dev/null +++ b/packages/crud/types/components/table/helper/selection.d.ts @@ -0,0 +1,6 @@ +export declare function useSelection({ emit }: { + emit: Vue.Emit; +}): { + selection: obj[]; + onSelectionChange: (selection: any[]) => void; +}; diff --git a/packages/crud/types/components/table/helper/sort.d.ts b/packages/crud/types/components/table/helper/sort.d.ts new file mode 100644 index 0000000..f996d62 --- /dev/null +++ b/packages/crud/types/components/table/helper/sort.d.ts @@ -0,0 +1,18 @@ +export declare function useSort({ config, Table, emit }: { + config: ClTable.Config; + Table: Vue.Ref; + emit: Vue.Emit; +}): { + defaultSort: { + prop: string; + order: "descending" | "ascending"; + } | { + prop?: undefined; + order?: undefined; + }; + onSortChange: ({ prop, order }: { + prop: string | undefined; + order: string; + }) => void; + changeSort: (prop: string, order: string) => void; +}; diff --git a/packages/crud/types/components/table/index.d.ts b/packages/crud/types/components/table/index.d.ts new file mode 100644 index 0000000..9ae9df3 --- /dev/null +++ b/packages/crud/types/components/table/index.d.ts @@ -0,0 +1,62 @@ +declare const _default: import('vue').DefineComponent any[]; + }; + autoHeight: { + type: BooleanConstructor; + default: any; + }; + height: any; + contextMenu: { + type: (ArrayConstructor | BooleanConstructor)[]; + default: any; + }; + defaultSort: ObjectConstructor; + sortRefresh: { + type: BooleanConstructor; + default: boolean; + }; + emptyText: StringConstructor; + rowKey: { + type: StringConstructor; + default: string; + }; +}>, () => import('vue').VNode, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("selection-change" | "sort-change")[], "selection-change" | "sort-change", import('vue').PublicProps, Readonly any[]; + }; + autoHeight: { + type: BooleanConstructor; + default: any; + }; + height: any; + contextMenu: { + type: (ArrayConstructor | BooleanConstructor)[]; + default: any; + }; + defaultSort: ObjectConstructor; + sortRefresh: { + type: BooleanConstructor; + default: boolean; + }; + emptyText: StringConstructor; + rowKey: { + type: StringConstructor; + default: string; + }; +}>> & Readonly<{ + "onSelection-change"?: (...args: any[]) => any; + "onSort-change"?: (...args: any[]) => any; +}>, { + columns: unknown[]; + autoHeight: boolean; + height: any; + contextMenu: boolean | unknown[]; + sortRefresh: boolean; + rowKey: string; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/components/upsert/index.d.ts b/packages/crud/types/components/upsert/index.d.ts new file mode 100644 index 0000000..7b9fb0b --- /dev/null +++ b/packages/crud/types/components/upsert/index.d.ts @@ -0,0 +1,38 @@ +declare const _default: import('vue').DefineComponent any[]; + }; + props: ObjectConstructor; + sync: BooleanConstructor; + op: ObjectConstructor; + dialog: ObjectConstructor; + onOpen: FunctionConstructor; + onOpened: FunctionConstructor; + onClose: FunctionConstructor; + onClosed: FunctionConstructor; + onInfo: FunctionConstructor; + onSubmit: FunctionConstructor; +}>, () => any, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, ("opened" | "closed")[], "opened" | "closed", import('vue').PublicProps, Readonly any[]; + }; + props: ObjectConstructor; + sync: BooleanConstructor; + op: ObjectConstructor; + dialog: ObjectConstructor; + onOpen: FunctionConstructor; + onOpened: FunctionConstructor; + onClose: FunctionConstructor; + onClosed: FunctionConstructor; + onInfo: FunctionConstructor; + onSubmit: FunctionConstructor; +}>> & Readonly<{ + onOpened?: (...args: any[]) => any; + onClosed?: (...args: any[]) => any; +}>, { + sync: boolean; + items: unknown[]; +}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>; +export default _default; diff --git a/packages/crud/types/emitter.d.ts b/packages/crud/types/emitter.d.ts new file mode 100644 index 0000000..b4d8fef --- /dev/null +++ b/packages/crud/types/emitter.d.ts @@ -0,0 +1,2 @@ +export declare const crudList: ClCrud.Ref[]; +export declare const emitter: Emitter; diff --git a/packages/crud/types/entry.d.ts b/packages/crud/types/entry.d.ts new file mode 100644 index 0000000..b78771c --- /dev/null +++ b/packages/crud/types/entry.d.ts @@ -0,0 +1,13 @@ +import { App } from 'vue'; +declare const Crud: { + install(app: App, options?: any): { + name: string; + }; +}; +export { Crud }; +export * from './emitter'; +export * from './hooks'; +export * from './locale'; +export { registerFormHook } from './utils/form-hook'; +export { renderNode } from './utils/vnode'; +export { ContextMenu } from './components/context-menu'; diff --git a/packages/crud/types/hooks/crud.d.ts b/packages/crud/types/hooks/crud.d.ts new file mode 100644 index 0000000..47788c3 --- /dev/null +++ b/packages/crud/types/hooks/crud.d.ts @@ -0,0 +1,10 @@ +import { Ref } from 'vue'; +export declare function useCrud(options?: ClCrud.Options, cb?: (app: ClCrud.Ref) => void): Ref; +export declare function useUpsert(options?: ClUpsert.Options): Ref, ClUpsert.Ref>; +export declare function useTable(options?: ClTable.Options, cb?: (table: ClTable.Ref) => void): Ref, ClTable.Ref>; +export declare function useForm(cb?: (app: ClForm.Ref) => void): Ref, ClForm.Ref>; +export declare function useAdvSearch(options?: ClAdvSearch.Options): Ref, ClAdvSearch.Ref>; +export declare function useSearch(options?: ClSearch.Options): Ref, ClSearch.Ref>; +export declare function useDialog(options?: { + onFullscreen(visible: boolean): void; +}): ClDialog.Provide; diff --git a/packages/crud/types/hooks/index.d.ts b/packages/crud/types/hooks/index.d.ts new file mode 100644 index 0000000..d1f89af --- /dev/null +++ b/packages/crud/types/hooks/index.d.ts @@ -0,0 +1,16 @@ +import { Mitt } from '../utils/mitt'; +export declare function useCore(): { + crud: ClCrud.Ref; + mitt: Mitt; +}; +export declare function useConfig(): Config; +export declare function useBrowser(): Browser; +export declare function useRefs(): { + refs: { + [key: string]: obj; + }; + setRefs: (name: string) => (el: any) => void; +}; +export declare function useProxy(ctx: any): any; +export declare function useElApi(keys: string[], el: any): obj; +export * from './crud'; diff --git a/packages/crud/types/locale/en.d.ts b/packages/crud/types/locale/en.d.ts new file mode 100644 index 0000000..d0c88bd --- /dev/null +++ b/packages/crud/types/locale/en.d.ts @@ -0,0 +1,33 @@ +declare const _default: { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; +}; +export default _default; diff --git a/packages/crud/types/locale/index.d.ts b/packages/crud/types/locale/index.d.ts new file mode 100644 index 0000000..a9e8362 --- /dev/null +++ b/packages/crud/types/locale/index.d.ts @@ -0,0 +1,130 @@ +export declare const locale: { + en: { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; + }; + ja: { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; + }; + "zh-cn": { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; + }; + "zh-tw": { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; + }; +}; diff --git a/packages/crud/types/locale/ja.d.ts b/packages/crud/types/locale/ja.d.ts new file mode 100644 index 0000000..d0c88bd --- /dev/null +++ b/packages/crud/types/locale/ja.d.ts @@ -0,0 +1,33 @@ +declare const _default: { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; +}; +export default _default; diff --git a/packages/crud/types/locale/zh-cn.d.ts b/packages/crud/types/locale/zh-cn.d.ts new file mode 100644 index 0000000..d0c88bd --- /dev/null +++ b/packages/crud/types/locale/zh-cn.d.ts @@ -0,0 +1,33 @@ +declare const _default: { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; +}; +export default _default; diff --git a/packages/crud/types/locale/zh-tw.d.ts b/packages/crud/types/locale/zh-tw.d.ts new file mode 100644 index 0000000..d0c88bd --- /dev/null +++ b/packages/crud/types/locale/zh-tw.d.ts @@ -0,0 +1,33 @@ +declare const _default: { + op: string; + add: string; + delete: string; + multiDelete: string; + update: string; + refresh: string; + info: string; + search: string; + reset: string; + clear: string; + save: string; + close: string; + confirm: string; + advSearch: string; + searchKey: string; + placeholder: string; + tips: string; + saveSuccess: string; + deleteSuccess: string; + deleteConfirm: string; + empty: string; + desc: string; + asc: string; + select: string; + deselect: string; + seeMore: string; + hideContent: string; + nonEmpty: string; + collapse: string; + expand: string; +}; +export default _default; diff --git a/packages/crud/types/main.d.ts b/packages/crud/types/main.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/crud/types/provide.d.ts b/packages/crud/types/provide.d.ts new file mode 100644 index 0000000..ad73709 --- /dev/null +++ b/packages/crud/types/provide.d.ts @@ -0,0 +1,2 @@ +import { App } from 'vue'; +export declare function useProvide(app: App, options?: Options): void; diff --git a/packages/crud/types/test/service.d.ts b/packages/crud/types/test/service.d.ts new file mode 100644 index 0000000..84d6dd2 --- /dev/null +++ b/packages/crud/types/test/service.d.ts @@ -0,0 +1,52 @@ +declare class TestService { + page(params: any): Promise; + update(params: { + id: any; + [key: string]: any; + }): Promise; + add(params: any): Promise; + info(params: { + id: any; + }): Promise<{ + id: number; + name: string; + createTime: string; + wages: number; + status: number; + account: string; + occupation: number; + phone: number; + }>; + delete(params: { + ids: any[]; + }): Promise; + list(): Promise<{ + id: number; + name: string; + createTime: string; + wages: number; + status: number; + account: string; + occupation: number; + phone: number; + }[]>; + search: { + fieldEq: { + propertyName: string; + comment: string; + source: string; + }[]; + fieldLike: { + propertyName: string; + comment: string; + dict: string[]; + source: string; + }[]; + keyWordLikeFields: { + propertyName: string; + comment: string; + source: string; + }[]; + }; +} +export { TestService }; diff --git a/packages/crud/types/utils/form-hook.d.ts b/packages/crud/types/utils/form-hook.d.ts new file mode 100644 index 0000000..7e5b2cf --- /dev/null +++ b/packages/crud/types/utils/form-hook.d.ts @@ -0,0 +1,9 @@ +export declare const format: { + [key: string]: ClForm.Hook["Fn"]; +}; +declare const formHook: { + bind(data: any): void; + submit(data: any): void; +}; +export declare function registerFormHook(name: string, fn: ClForm.Hook["Fn"]): void; +export default formHook; diff --git a/packages/crud/types/utils/global.d.ts b/packages/crud/types/utils/global.d.ts new file mode 100644 index 0000000..fb15cd0 --- /dev/null +++ b/packages/crud/types/utils/global.d.ts @@ -0,0 +1,7 @@ +import { App } from 'vue'; +declare const _default: { + readonly vue: App; + get(key: string): any; + set(key: string, value: any): void; +}; +export default _default; diff --git a/packages/crud/types/utils/index.d.ts b/packages/crud/types/utils/index.d.ts new file mode 100644 index 0000000..2351cd0 --- /dev/null +++ b/packages/crud/types/utils/index.d.ts @@ -0,0 +1,14 @@ +export declare function isObject(val: any): boolean; +export declare function parsePx(val: string | number): string; +export declare function dataset(obj: any, key: string, value: any): any; +export declare function contains(parent: any, node: any): any; +export declare function mergeConfig(a: any, b?: any): any; +export declare function merge(d1: any, d2: any): any; +export declare function addClass(el: Element, name: string): void; +export declare function removeClass(el: Element, name: string): void; +export declare function getValue(value: T | Vue.Ref | ((d: any) => T), data?: any): T; +export declare function deepFind(value: any, list: any[], options?: { + allLevels: boolean; +}): any; +export declare function uuid(separator?: string): string; +export declare function uniqueFns(fns: any[]): any[]; diff --git a/packages/crud/types/utils/mitt.d.ts b/packages/crud/types/utils/mitt.d.ts new file mode 100644 index 0000000..be94bfc --- /dev/null +++ b/packages/crud/types/utils/mitt.d.ts @@ -0,0 +1,10 @@ +declare const mitt: import('mitt').Emitter>; +declare class Mitt { + id: number; + constructor(id?: number); + send(type: "emit" | "off" | "on", name: string, ...args: any[]): void; + emit(name: string, ...args: any[]): void; + off(name: string, handler: (...args: any[]) => void): void; + on(name: string, handler: (...args: any[]) => void): void; +} +export { Mitt, mitt }; diff --git a/packages/crud/types/utils/parse.d.ts b/packages/crud/types/utils/parse.d.ts new file mode 100644 index 0000000..d4639fd --- /dev/null +++ b/packages/crud/types/utils/parse.d.ts @@ -0,0 +1,5 @@ +export declare function parseExtensionComponent(vnode: Render.Component): { + children: any; +} | { + children?: undefined; +}; diff --git a/packages/crud/types/utils/vnode.d.ts b/packages/crud/types/utils/vnode.d.ts new file mode 100644 index 0000000..534c600 --- /dev/null +++ b/packages/crud/types/utils/vnode.d.ts @@ -0,0 +1,14 @@ +import { VNode } from 'vue'; +interface Options { + prop?: string; + scope?: any; + item?: any; + slots?: any; + children?: any[] & any; + custom?: (vnode: any) => any; + render?: "slot" | null; + [key: string]: any; +} +export declare function parseNode(vnode: any, options: Options): VNode; +export declare function renderNode(vnode: any, options: Options): any; +export {}; diff --git a/packages/crud/vite.config.ts b/packages/crud/vite.config.ts new file mode 100644 index 0000000..b8e622c --- /dev/null +++ b/packages/crud/vite.config.ts @@ -0,0 +1,49 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import dts from "vite-plugin-dts"; +import { resolve } from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + dts({ + include: ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + outDir: "types" + }) + ], + + css: { + preprocessorOptions: { + scss: { + charset: false, + api: "modern-compiler" + } + } + }, + + build: { + lib: { + entry: resolve(__dirname, "src/entry.ts"), + name: "index", + fileName: (format) => `index.${format}.js`, + cssFileName: "index" + }, + rollupOptions: { + external: ["element-plus", "@element-plus/icons-vue", "vue"], + output: { + exports: "named", + globals: { + "element-plus": "ElementPlus", + "@element-plus/icons-vue": "ElementPlusIconsVue", + vue: "Vue" + } + } + }, + sourcemap: true, + minify: "terser", + cssCodeSplit: false + } +}); diff --git a/packages/crud/yarn.lock b/packages/crud/yarn.lock new file mode 100644 index 0000000..4271e79 --- /dev/null +++ b/packages/crud/yarn.lock @@ -0,0 +1,1790 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.26.2", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + +"@babel/core@^7.27.1": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" + integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.6" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== + dependencies: + "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": + version "7.27.3" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281" + integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.27.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-member-expression-to-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" + integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-imports@^7.25.9", "@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.6": + version "7.27.6" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" + +"@babel/parser@^7.26.9", "@babel/parser@^7.27.2", "@babel/parser@^7.27.5", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== + dependencies: + "@babel/types" "^7.28.0" + +"@babel/plugin-syntax-jsx@^7.25.9": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-typescript@^7.27.1": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz#796cbd249ab56c18168b49e3e1d341b72af04a6b" + integrity sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + +"@babel/template@^7.26.9", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.26.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": + version "7.28.0" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" + +"@babel/types@^7.26.9", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.28.0": + version "7.28.1" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.28.1.tgz#2aaf3c10b31ba03a77ac84f52b3912a0edef4cf9" + integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@ctrl/tinycolor@^3.4.1": + version "3.6.1" + resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + +"@element-plus/icons-vue@^2.3.1": + version "2.3.1" + resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz#1f635ad5fdd5c85ed936481525570e82b5a8307a" + integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg== + +"@esbuild/aix-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727" + integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA== + +"@esbuild/android-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6" + integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w== + +"@esbuild/android-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059" + integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw== + +"@esbuild/android-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0" + integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA== + +"@esbuild/darwin-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d" + integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw== + +"@esbuild/darwin-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2" + integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg== + +"@esbuild/freebsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada" + integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA== + +"@esbuild/freebsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343" + integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw== + +"@esbuild/linux-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9" + integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w== + +"@esbuild/linux-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19" + integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg== + +"@esbuild/linux-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d" + integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg== + +"@esbuild/linux-loong64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4" + integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ== + +"@esbuild/linux-mips64el@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340" + integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw== + +"@esbuild/linux-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe" + integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ== + +"@esbuild/linux-riscv64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083" + integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg== + +"@esbuild/linux-s390x@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71" + integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg== + +"@esbuild/linux-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz#9a4f78c75c051e8c060183ebb39a269ba936a2ac" + integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ== + +"@esbuild/netbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0" + integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw== + +"@esbuild/netbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c" + integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg== + +"@esbuild/openbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45" + integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ== + +"@esbuild/openbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc" + integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ== + +"@esbuild/openharmony-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a" + integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg== + +"@esbuild/sunos-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb" + integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w== + +"@esbuild/win32-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1" + integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ== + +"@esbuild/win32-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4" + integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg== + +"@esbuild/win32-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c" + integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw== + +"@floating-ui/core@^1.7.2": + version "1.7.2" + resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.2.tgz#3d1c35263950b314b6d5a72c8bfb9e3c1551aefd" + integrity sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw== + dependencies: + "@floating-ui/utils" "^0.2.10" + +"@floating-ui/dom@^1.0.1": + version "1.7.2" + resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.2.tgz#3540b051cf5ce0d4f4db5fb2507a76e8ea5b4a45" + integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA== + dependencies: + "@floating-ui/core" "^1.7.2" + "@floating-ui/utils" "^0.2.10" + +"@floating-ui/utils@^0.2.10": + version "0.2.10" + resolved "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c" + integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.12" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@microsoft/api-extractor-model@7.30.6": + version "7.30.6" + resolved "https://registry.npmmirror.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.6.tgz#cd9c434521dda3b226cc0f6aefb9c20afaf99c92" + integrity sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg== + dependencies: + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.13.1" + +"@microsoft/api-extractor@^7.50.1": + version "7.52.8" + resolved "https://registry.npmmirror.com/@microsoft/api-extractor/-/api-extractor-7.52.8.tgz#7cc944f44ca1b1ad9d7272ab5d98e81987c1f8ca" + integrity sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg== + dependencies: + "@microsoft/api-extractor-model" "7.30.6" + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.13.1" + "@rushstack/rig-package" "0.5.3" + "@rushstack/terminal" "0.15.3" + "@rushstack/ts-command-line" "5.0.1" + lodash "~4.17.15" + minimatch "~3.0.3" + resolve "~1.22.1" + semver "~7.5.4" + source-map "~0.6.1" + typescript "5.8.2" + +"@microsoft/tsdoc-config@~0.17.1": + version "0.17.1" + resolved "https://registry.npmmirror.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" + integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw== + dependencies: + "@microsoft/tsdoc" "0.15.1" + ajv "~8.12.0" + jju "~1.4.0" + resolve "~1.22.2" + +"@microsoft/tsdoc@0.15.1", "@microsoft/tsdoc@~0.15.1": + version "0.15.1" + resolved "https://registry.npmmirror.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" + integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== + +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== + +"@parcel/watcher-darwin-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== + +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== + +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + +"@parcel/watcher@^2.4.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" + +"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7": + version "2.11.7" + resolved "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671" + integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ== + +"@rolldown/pluginutils@^1.0.0-beta.9": + version "1.0.0-beta.28" + resolved "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.28.tgz#3a5887a3cd4b556afedf1f4a282fd061e2bb2524" + integrity sha512-fe3/1HZ3qJmXvkGv1kacKq2b+x9gbcyF1hnmLBVrRFEQWoOcRapQjXf8+hgyxI0EJAbnKEtrp5yhohQCFCjycw== + +"@rollup/pluginutils@^5.1.4": + version "5.2.0" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz#eac25ca5b0bdda4ba735ddaca5fbf26bd435f602" + integrity sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz#8560592f0dcf43b8cb0949af9f1d916205148d12" + integrity sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA== + +"@rollup/rollup-android-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz#6bfb777bbce998691b6fd3e916b05cd46392d020" + integrity sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ== + +"@rollup/rollup-darwin-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz#7efce10220293a22e7b7b595d05d8b8400a7bcf3" + integrity sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA== + +"@rollup/rollup-darwin-x64@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz#c617a8ece21050bfbea299c126767d2e70cfa79a" + integrity sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og== + +"@rollup/rollup-freebsd-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz#5a6af0a9acf82162d2910933649ae24fc0ea3ecb" + integrity sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g== + +"@rollup/rollup-freebsd-x64@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz#ae9709463560196fc275bd0da598668a2e341023" + integrity sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A== + +"@rollup/rollup-linux-arm-gnueabihf@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz#6ec52661764dbd54c19d6520a403aa385a5c0fbf" + integrity sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q== + +"@rollup/rollup-linux-arm-musleabihf@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz#fd33ba4a43ef8419e96811236493d19436271923" + integrity sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q== + +"@rollup/rollup-linux-arm64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz#933b3d99b73c9d7bf4506cab0d5d313c7e74fd2d" + integrity sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw== + +"@rollup/rollup-linux-arm64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz#dbe9ae24ee9e97b75662fddcb69eb7f23c89280a" + integrity sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog== + +"@rollup/rollup-linux-loongarch64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz#818c5a071eec744436dbcdd76fe9c3c869dc9a8d" + integrity sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg== + +"@rollup/rollup-linux-powerpc64le-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz#6b8591def27d886fa147fb0340126c7d6682a7e4" + integrity sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg== + +"@rollup/rollup-linux-riscv64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz#f1861ac4ee8da64e0b0d23853ff26fe2baa876cf" + integrity sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw== + +"@rollup/rollup-linux-riscv64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz#320c961401a923b374e358664527b188e374e1ae" + integrity sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA== + +"@rollup/rollup-linux-s390x-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz#1763eed3362b50b6164d3f0947486c03cc7e616d" + integrity sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw== + +"@rollup/rollup-linux-x64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz#0d4c8d0b8f801902f0844a40a9d981a0179f4971" + integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw== + +"@rollup/rollup-linux-x64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz#ec30bb48b5fe22a3aaba98072f2d5b7139e1a8eb" + integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw== + +"@rollup/rollup-win32-arm64-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz#27a6e48d1502e8e4bed96bedfb533738655874f2" + integrity sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg== + +"@rollup/rollup-win32-ia32-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz#a2fbad3bec20ff879f3fd51720adf33692ca8f3d" + integrity sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw== + +"@rollup/rollup-win32-x64-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz#e5085c6d13da15b4c5133cd2a6bb11f25b6bb77a" + integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA== + +"@rushstack/node-core-library@5.13.1": + version "5.13.1" + resolved "https://registry.npmmirror.com/@rushstack/node-core-library/-/node-core-library-5.13.1.tgz#e56b915ecb08b5a92711acac6b233417353a32dc" + integrity sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q== + dependencies: + ajv "~8.13.0" + ajv-draft-04 "~1.0.0" + ajv-formats "~3.0.1" + fs-extra "~11.3.0" + import-lazy "~4.0.0" + jju "~1.4.0" + resolve "~1.22.1" + semver "~7.5.4" + +"@rushstack/rig-package@0.5.3": + version "0.5.3" + resolved "https://registry.npmmirror.com/@rushstack/rig-package/-/rig-package-0.5.3.tgz#ea4d8a3458540b1295500149c04e645f23134e5d" + integrity sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow== + dependencies: + resolve "~1.22.1" + strip-json-comments "~3.1.1" + +"@rushstack/terminal@0.15.3": + version "0.15.3" + resolved "https://registry.npmmirror.com/@rushstack/terminal/-/terminal-0.15.3.tgz#365e0ae5ac73bb4883b096ae36c5011f52911861" + integrity sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g== + dependencies: + "@rushstack/node-core-library" "5.13.1" + supports-color "~8.1.1" + +"@rushstack/ts-command-line@5.0.1": + version "5.0.1" + resolved "https://registry.npmmirror.com/@rushstack/ts-command-line/-/ts-command-line-5.0.1.tgz#e147394b5ce87ef79db95b5b4f155461d6f2c50e" + integrity sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q== + dependencies: + "@rushstack/terminal" "0.15.3" + "@types/argparse" "1.0.38" + argparse "~1.0.9" + string-argv "~0.3.1" + +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.npmmirror.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== + +"@types/estree@1.0.8", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/lodash-es@^4.17.6": + version "4.17.12" + resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*", "@types/lodash@^4.14.182": + version "4.17.20" + resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93" + integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA== + +"@types/node@^20.11.16": + version "20.19.9" + resolved "https://registry.npmmirror.com/@types/node/-/node-20.19.9.tgz#ca9a58193fec361cc6e859d88b52261853f1f0d3" + integrity sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw== + dependencies: + undici-types "~6.21.0" + +"@types/web-bluetooth@^0.0.16": + version "0.0.16" + resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" + integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== + +"@vitejs/plugin-vue-jsx@^4.1.1": + version "4.2.0" + resolved "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.2.0.tgz#2738ec05d4705ed553a107342017192e37351640" + integrity sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw== + dependencies: + "@babel/core" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.27.1" + "@rolldown/pluginutils" "^1.0.0-beta.9" + "@vue/babel-plugin-jsx" "^1.4.0" + +"@vitejs/plugin-vue@^5.2.1": + version "5.2.4" + resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8" + integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA== + +"@volar/language-core@2.4.15": + version "2.4.15" + resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.15.tgz#759d04cb4eab9920560b8bcfa4515d5b08a1b7ce" + integrity sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA== + dependencies: + "@volar/source-map" "2.4.15" + +"@volar/language-core@2.4.20", "@volar/language-core@~2.4.11": + version "2.4.20" + resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.20.tgz#be6d4efc6bb2f77d6c01bbbb3ef53661a869e0d0" + integrity sha512-dRDF1G33xaAIDqR6+mXUIjXYdu9vzSxlMGfMEwBxQsfY/JMUEXSpLTR057oTKlUQ2nIvCmP9k94A8h8z2VrNSA== + dependencies: + "@volar/source-map" "2.4.20" + +"@volar/source-map@2.4.15": + version "2.4.15" + resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.15.tgz#18aba09994c0268e59a418f9d738e4a85302781d" + integrity sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg== + +"@volar/source-map@2.4.20": + version "2.4.20" + resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.20.tgz#55ff844410d8d670ef2c3722e2717223edbf8717" + integrity sha512-mVjmFQH8mC+nUaVwmbxoYUy8cww+abaO8dWzqPUjilsavjxH0jCJ3Mp8HFuHsdewZs2c+SP+EO7hCd8Z92whJg== + +"@volar/typescript@2.4.15": + version "2.4.15" + resolved "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.15.tgz#1445d23f8e4f9ad821b6bfa58cf4a2b980dc5f97" + integrity sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg== + dependencies: + "@volar/language-core" "2.4.15" + path-browserify "^1.0.1" + vscode-uri "^3.0.8" + +"@volar/typescript@^2.4.11": + version "2.4.20" + resolved "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.20.tgz#c388d6fe5ee31ddeb5338d01dbbfc71054065a7c" + integrity sha512-Oc4DczPwQyXcVbd+5RsNEqX6ia0+w3p+klwdZQ6ZKhFjWoBP9PCPQYlKYRi/tDemWphW93P/Vv13vcE9I9D2GQ== + dependencies: + "@volar/language-core" "2.4.20" + path-browserify "^1.0.1" + vscode-uri "^3.0.8" + +"@vue/babel-helper-vue-transform-on@1.4.0": + version "1.4.0" + resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz#616020488692a9c42a613280d62ed1b727045d95" + integrity sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw== + +"@vue/babel-plugin-jsx@^1.4.0": + version "1.4.0" + resolved "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz#c155c795ce980edf46aa6feceed93945a95ca658" + integrity sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.9" + "@babel/types" "^7.26.9" + "@vue/babel-helper-vue-transform-on" "1.4.0" + "@vue/babel-plugin-resolve-type" "1.4.0" + "@vue/shared" "^3.5.13" + +"@vue/babel-plugin-resolve-type@1.4.0": + version "1.4.0" + resolved "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz#4d357a81fb0cc9cad0e8c81b118115bda2c51543" + integrity sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/parser" "^7.26.9" + "@vue/compiler-sfc" "^3.5.13" + +"@vue/compiler-core@3.5.17": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.17.tgz#23d291bd01b863da3ef2e26e7db84d8e01a9b4c5" + integrity sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA== + dependencies: + "@babel/parser" "^7.27.5" + "@vue/shared" "3.5.17" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.1" + +"@vue/compiler-dom@3.5.17", "@vue/compiler-dom@^3.5.0": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz#7bc19a20e23b670243a64b47ce3a890239b870be" + integrity sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ== + dependencies: + "@vue/compiler-core" "3.5.17" + "@vue/shared" "3.5.17" + +"@vue/compiler-sfc@3.5.17", "@vue/compiler-sfc@^3.5.13": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz#c518871276e26593612bdab36f3f5bcd053b13bf" + integrity sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww== + dependencies: + "@babel/parser" "^7.27.5" + "@vue/compiler-core" "3.5.17" + "@vue/compiler-dom" "3.5.17" + "@vue/compiler-ssr" "3.5.17" + "@vue/shared" "3.5.17" + estree-walker "^2.0.2" + magic-string "^0.30.17" + postcss "^8.5.6" + source-map-js "^1.2.1" + +"@vue/compiler-ssr@3.5.17": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz#14ba3b7bba6e0e1fd02002316263165a5d1046c7" + integrity sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ== + dependencies: + "@vue/compiler-dom" "3.5.17" + "@vue/shared" "3.5.17" + +"@vue/compiler-vue2@^2.7.16": + version "2.7.16" + resolved "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249" + integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +"@vue/language-core@2.2.0": + version "2.2.0" + resolved "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.0.tgz#e48c54584f889f78b120ce10a050dfb316c7fcdf" + integrity sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw== + dependencies: + "@volar/language-core" "~2.4.11" + "@vue/compiler-dom" "^3.5.0" + "@vue/compiler-vue2" "^2.7.16" + "@vue/shared" "^3.5.0" + alien-signals "^0.4.9" + minimatch "^9.0.3" + muggle-string "^0.4.1" + path-browserify "^1.0.1" + +"@vue/language-core@2.2.12": + version "2.2.12" + resolved "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.12.tgz#d01f7e865f593f968cb65c12a13d8337e65641f0" + integrity sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA== + dependencies: + "@volar/language-core" "2.4.15" + "@vue/compiler-dom" "^3.5.0" + "@vue/compiler-vue2" "^2.7.16" + "@vue/shared" "^3.5.0" + alien-signals "^1.0.3" + minimatch "^9.0.3" + muggle-string "^0.4.1" + path-browserify "^1.0.1" + +"@vue/reactivity@3.5.17": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.17.tgz#169b5dcf96c7f23788e5ed9745ec8a7227f2125e" + integrity sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw== + dependencies: + "@vue/shared" "3.5.17" + +"@vue/runtime-core@3.5.17", "@vue/runtime-core@^3.5.13": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.17.tgz#b17bd41e13011e85e9b1025545292d43f5512730" + integrity sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q== + dependencies: + "@vue/reactivity" "3.5.17" + "@vue/shared" "3.5.17" + +"@vue/runtime-dom@3.5.17": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz#8e325e29cd03097fe179032fc8df384a426fc83a" + integrity sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g== + dependencies: + "@vue/reactivity" "3.5.17" + "@vue/runtime-core" "3.5.17" + "@vue/shared" "3.5.17" + csstype "^3.1.3" + +"@vue/server-renderer@3.5.17": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.17.tgz#9b8fd6a40a3d55322509fafe78ac841ede649fbe" + integrity sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA== + dependencies: + "@vue/compiler-ssr" "3.5.17" + "@vue/shared" "3.5.17" + +"@vue/shared@3.5.17", "@vue/shared@^3.5.0", "@vue/shared@^3.5.13": + version "3.5.17" + resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.17.tgz#e8b3a41f0be76499882a89e8ed40d86a70fa4b70" + integrity sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg== + +"@vueuse/core@^9.1.0": + version "9.13.0" + resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" + integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== + dependencies: + "@types/web-bluetooth" "^0.0.16" + "@vueuse/metadata" "9.13.0" + "@vueuse/shared" "9.13.0" + vue-demi "*" + +"@vueuse/metadata@9.13.0": + version "9.13.0" + resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" + integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== + +"@vueuse/shared@9.13.0": + version "9.13.0" + resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" + integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== + dependencies: + vue-demi "*" + +acorn@^8.14.0: + version "8.15.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +ajv-draft-04@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv-formats@~3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@^8.0.0: + version "8.17.1" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ajv@~8.12.0: + version "8.12.0" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@~8.13.0: + version "8.13.0" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + 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.9: + version "0.4.14" + resolved "https://registry.npmmirror.com/alien-signals/-/alien-signals-0.4.14.tgz#9ff8f72a272300a51692f54bd9bbbada78fbf539" + integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== + +alien-signals@^1.0.3: + version "1.0.13" + resolved "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.13.tgz#8d6db73462f742ee6b89671fbd8c37d0b1727a7e" + integrity sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg== + +argparse@~1.0.9: + version "1.0.10" + resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +async-validator@^4.2.5: + version "4.2.5" + resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.25.1" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== + dependencies: + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + +caniuse-lite@^1.0.30001726: + version "1.0.30001727" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" + integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== + +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +compare-versions@^6.1.1: + version "6.1.1" + resolved "https://registry.npmmirror.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +confbox@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz#8652f53961c74d9e081784beed78555974a9c110" + integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +dayjs@^1.11.13: + version "1.11.13" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + +debug@^4.1.0, debug@^4.3.1, debug@^4.4.0: + version "4.4.1" + resolved "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +electron-to-chromium@^1.5.173: + version "1.5.187" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.187.tgz#8c58854e065962351dc87e95614dd78d50425966" + integrity sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA== + +element-plus@^2.10.4: + version "2.10.4" + resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.10.4.tgz#72de60a6074be79f9f1b299f422e7ac96a3b5e9a" + integrity sha512-UD4elWHrCnp1xlPhbXmVcaKFLCRaRAY6WWRwemGfGW3ceIjXm9fSYc9RNH3AiOEA6Ds1p9ZvhCs76CR9J8Vd+A== + dependencies: + "@ctrl/tinycolor" "^3.4.1" + "@element-plus/icons-vue" "^2.3.1" + "@floating-ui/dom" "^1.0.1" + "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7" + "@types/lodash" "^4.14.182" + "@types/lodash-es" "^4.17.6" + "@vueuse/core" "^9.1.0" + async-validator "^4.2.5" + dayjs "^1.11.13" + escape-html "^1.0.3" + lodash "^4.17.21" + lodash-es "^4.17.21" + lodash-unified "^1.0.2" + memoize-one "^6.0.0" + normalize-wheel-es "^1.2.0" + +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +esbuild@^0.25.0: + version "0.25.8" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.8.tgz#482d42198b427c9c2f3a81b63d7663aecb1dda07" + integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.8" + "@esbuild/android-arm" "0.25.8" + "@esbuild/android-arm64" "0.25.8" + "@esbuild/android-x64" "0.25.8" + "@esbuild/darwin-arm64" "0.25.8" + "@esbuild/darwin-x64" "0.25.8" + "@esbuild/freebsd-arm64" "0.25.8" + "@esbuild/freebsd-x64" "0.25.8" + "@esbuild/linux-arm" "0.25.8" + "@esbuild/linux-arm64" "0.25.8" + "@esbuild/linux-ia32" "0.25.8" + "@esbuild/linux-loong64" "0.25.8" + "@esbuild/linux-mips64el" "0.25.8" + "@esbuild/linux-ppc64" "0.25.8" + "@esbuild/linux-riscv64" "0.25.8" + "@esbuild/linux-s390x" "0.25.8" + "@esbuild/linux-x64" "0.25.8" + "@esbuild/netbsd-arm64" "0.25.8" + "@esbuild/netbsd-x64" "0.25.8" + "@esbuild/openbsd-arm64" "0.25.8" + "@esbuild/openbsd-x64" "0.25.8" + "@esbuild/openharmony-arm64" "0.25.8" + "@esbuild/sunos-x64" "0.25.8" + "@esbuild/win32-arm64" "0.25.8" + "@esbuild/win32-ia32" "0.25.8" + "@esbuild/win32-x64" "0.25.8" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +exsolve@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.7.tgz#3b74e4c7ca5c5f9a19c3626ca857309fa99f9e9e" + integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +fdir@^6.4.4: + version "6.4.6" + resolved "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +fs-extra@~11.3.0: + version "11.3.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +immutable@^5.0.2: + version "5.1.3" + resolved "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz#e6486694c8b76c37c063cca92399fa64098634d4" + integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg== + +import-lazy@~4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +jju@~1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +local-pkg@^1.0.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz#f5fe74a97a3bd3c165788ee08ca9fbe998dc58dd" + integrity sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg== + dependencies: + mlly "^1.7.4" + pkg-types "^2.0.1" + quansync "^0.2.8" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash-unified@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894" + integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== + +lodash@^4.17.21, lodash@~4.17.15: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +micromatch@^4.0.5: + version "4.0.8" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimatch@~3.0.3: + version "3.0.8" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" + integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + dependencies: + brace-expansion "^1.1.7" + +mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== + dependencies: + acorn "^8.14.0" + pathe "^2.0.1" + pkg-types "^1.3.0" + ufo "^1.5.4" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +muggle-string@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" + integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== + +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-wheel-es@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz#0fa2593d619f7245a541652619105ab076acf09e" + integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pathe@^2.0.1, pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.3" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +pkg-types@^1.3.0: + version "1.3.1" + resolved "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + +pkg-types@^2.0.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.2.0.tgz#049bf404f82a66c465200149457acf0c5fb0fb2d" + integrity sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ== + dependencies: + confbox "^0.2.2" + exsolve "^1.0.7" + pathe "^2.0.3" + +postcss@^8.5.3, postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prettier@^3.5.1: + version "3.6.2" + resolved "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +quansync@^0.2.8: + version "0.2.10" + resolved "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1" + integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A== + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve@~1.22.1, resolve@~1.22.2: + version "1.22.10" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup@^4.34.9: + version "4.45.1" + resolved "https://registry.npmmirror.com/rollup/-/rollup-4.45.1.tgz#d0ef72a8d0a9210d832f9c3c5f3b6a2aa4b0ba64" + integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.45.1" + "@rollup/rollup-android-arm64" "4.45.1" + "@rollup/rollup-darwin-arm64" "4.45.1" + "@rollup/rollup-darwin-x64" "4.45.1" + "@rollup/rollup-freebsd-arm64" "4.45.1" + "@rollup/rollup-freebsd-x64" "4.45.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.45.1" + "@rollup/rollup-linux-arm-musleabihf" "4.45.1" + "@rollup/rollup-linux-arm64-gnu" "4.45.1" + "@rollup/rollup-linux-arm64-musl" "4.45.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.45.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1" + "@rollup/rollup-linux-riscv64-gnu" "4.45.1" + "@rollup/rollup-linux-riscv64-musl" "4.45.1" + "@rollup/rollup-linux-s390x-gnu" "4.45.1" + "@rollup/rollup-linux-x64-gnu" "4.45.1" + "@rollup/rollup-linux-x64-musl" "4.45.1" + "@rollup/rollup-win32-arm64-msvc" "4.45.1" + "@rollup/rollup-win32-ia32-msvc" "4.45.1" + "@rollup/rollup-win32-x64-msvc" "4.45.1" + fsevents "~2.3.2" + +sass-loader@^16.0.5: + version "16.0.5" + resolved "https://registry.npmmirror.com/sass-loader/-/sass-loader-16.0.5.tgz#257bc90119ade066851cafe7f2c3f3504c7cda98" + integrity sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw== + dependencies: + neo-async "^2.6.2" + +sass@^1.85.0: + version "1.89.2" + resolved "https://registry.npmmirror.com/sass/-/sass-1.89.2.tgz#a771716aeae774e2b529f72c0ff2dfd46c9de10e" + integrity sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA== + dependencies: + chokidar "^4.0.0" + immutable "^5.0.2" + source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@~7.5.4: + version "7.5.4" + resolved "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +string-argv@~0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +strip-json-comments@~3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@~8.1.1: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tinyglobby@^0.2.13: + version "0.2.14" + resolved "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +typescript@5.8.2: + version "5.8.2" + resolved "https://registry.npmmirror.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" + integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== + +typescript@^5.3.3: + version "5.8.3" + resolved "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== + +ufo@^1.5.4: + version "1.6.1" + resolved "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b" + integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2, uri-js@^4.4.1: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vite-plugin-dts@^4.5.0: + version "4.5.4" + resolved "https://registry.npmmirror.com/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz#51b60aaaa760d9cf5c2bb3676c69d81910d6b08c" + integrity sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg== + dependencies: + "@microsoft/api-extractor" "^7.50.1" + "@rollup/pluginutils" "^5.1.4" + "@volar/typescript" "^2.4.11" + "@vue/language-core" "2.2.0" + compare-versions "^6.1.1" + debug "^4.4.0" + kolorist "^1.8.0" + local-pkg "^1.0.0" + magic-string "^0.30.17" + +vite@^6.1.0: + version "6.3.5" + resolved "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz#fec73879013c9c0128c8d284504c6d19410d12a3" + integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" + tinyglobby "^0.2.13" + optionalDependencies: + fsevents "~2.3.3" + +vscode-uri@^3.0.8: + version "3.1.0" + resolved "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== + +vue-demi@*: + version "0.14.10" + resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04" + integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg== + +vue-tsc@^2.2.2: + version "2.2.12" + resolved "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.12.tgz#5f719b08ef7390a763c1a20169ca5c9d09d55688" + integrity sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw== + dependencies: + "@volar/typescript" "2.4.15" + "@vue/language-core" "2.2.12" + +vue@^3.5.13: + version "3.5.17" + resolved "https://registry.npmmirror.com/vue/-/vue-3.5.17.tgz#ea8a6a45abb2b0620e7d479319ce8434b55650cf" + integrity sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g== + dependencies: + "@vue/compiler-dom" "3.5.17" + "@vue/compiler-sfc" "3.5.17" + "@vue/runtime-dom" "3.5.17" + "@vue/server-renderer" "3.5.17" + "@vue/shared" "3.5.17" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/packages/vite-plugin/.eslintrc.js b/packages/vite-plugin/.eslintrc.js new file mode 100644 index 0000000..53106c1 --- /dev/null +++ b/packages/vite-plugin/.eslintrc.js @@ -0,0 +1,12 @@ +export default { + parser: "@typescript-eslint/parser", + extends: ["plugin:@typescript-eslint/recommended"], + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + ecmaVersion: 2020, + sourceType: "module", + createDefaultProgram: true, + }, + rules: {}, +}; diff --git a/packages/vite-plugin/.prettierrc b/packages/vite-plugin/.prettierrc new file mode 100644 index 0000000..5305129 --- /dev/null +++ b/packages/vite-plugin/.prettierrc @@ -0,0 +1,8 @@ +{ + "tabWidth": 4, + "useTabs": true, + "semi": true, + "jsxBracketSameLine": true, + "singleQuote": false, + "printWidth": 100 +} diff --git a/packages/vite-plugin/client.d.ts b/packages/vite-plugin/client.d.ts new file mode 100644 index 0000000..4982a91 --- /dev/null +++ b/packages/vite-plugin/client.d.ts @@ -0,0 +1,48 @@ +declare module "virtual:ctx" { + const ctx: { + serviceLang: string; + modules: string[]; + }; + + export { ctx }; +} + +declare module "virtual:eps" { + const eps: { + isUpdate: boolean; + list: { + prefix: string; + api: { + method: string; + path: string; + summary: string; + dts: { + [key: string]: string; + }; + [key: string]: any; + }[]; + namespace: string; + name: string; + module: string; + columns: { + comment: string; + nullable: boolean; + propertyName: string; + type: string; + [key: string]: any; + }[]; + [key: string]: any; + }[]; + service: any; + }; + + export { eps }; +} + +declare module "virtual:demo"; +declare module "virtual:svg-register"; + +declare module "virtual:svg-icons" { + const svgIcons: string[]; + export { svgIcons }; +} diff --git a/packages/vite-plugin/dist/base.d.ts b/packages/vite-plugin/dist/base.d.ts new file mode 100644 index 0000000..8345a78 --- /dev/null +++ b/packages/vite-plugin/dist/base.d.ts @@ -0,0 +1,2 @@ +import type { Plugin } from "vite"; +export declare function base(): Plugin; diff --git a/packages/vite-plugin/dist/config.d.ts b/packages/vite-plugin/dist/config.d.ts new file mode 100644 index 0000000..7674c2f --- /dev/null +++ b/packages/vite-plugin/dist/config.d.ts @@ -0,0 +1,39 @@ +import type { Type } from "../types"; +export declare const config: { + type: Type; + reqUrl: string; + demo: boolean; + nameTag: boolean; + eps: { + enable: boolean; + api: string; + dist: string; + mapping: ({ + custom: ({ propertyName, type }: { + propertyName: string; + type: string; + }) => null; + type?: undefined; + test?: undefined; + } | { + type: string; + test: string[]; + custom?: undefined; + })[]; + }; + svg: { + skipNames: string[]; + }; + tailwind: { + enable: boolean; + remUnit: number; + remPrecision: number; + rpxRatio: number; + darkTextClass: string; + }; + uniapp: { + isPlugin: boolean; + }; + clean: boolean; + utsPlatform: string; +}; diff --git a/packages/vite-plugin/dist/ctx/index.d.ts b/packages/vite-plugin/dist/ctx/index.d.ts new file mode 100644 index 0000000..87eafb6 --- /dev/null +++ b/packages/vite-plugin/dist/ctx/index.d.ts @@ -0,0 +1,2 @@ +import type { Ctx } from "../../types"; +export declare function createCtx(): Promise; diff --git a/packages/vite-plugin/dist/demo.d.ts b/packages/vite-plugin/dist/demo.d.ts new file mode 100644 index 0000000..5f66c93 --- /dev/null +++ b/packages/vite-plugin/dist/demo.d.ts @@ -0,0 +1,2 @@ +import type { Plugin } from "vite"; +export declare function demo(enable?: boolean): Plugin; diff --git a/packages/vite-plugin/dist/eps/flatten.d.ts b/packages/vite-plugin/dist/eps/flatten.d.ts new file mode 100644 index 0000000..8aba397 --- /dev/null +++ b/packages/vite-plugin/dist/eps/flatten.d.ts @@ -0,0 +1,7 @@ +/** + * 将模板字符串扁平化处理,转换为 Service 类型定义 + * @param template - 包含 Service 类型定义的模板字符串 + * @returns 处理后的 Service 类型定义字符串 + * @throws {Error} 当模板中找不到 Service 类型定义时抛出错误 + */ +export declare function flatten(template: string): string; diff --git a/packages/vite-plugin/dist/eps/index.d.ts b/packages/vite-plugin/dist/eps/index.d.ts new file mode 100644 index 0000000..a3719cf --- /dev/null +++ b/packages/vite-plugin/dist/eps/index.d.ts @@ -0,0 +1,18 @@ +import type { Eps } from "../../types"; +/** + * 主入口:创建 eps 相关文件和 service + */ +export declare function createEps(): Promise<{ + service: {}; + serviceCode: { + content: string; + types: string[]; + }; + list: Eps.Entity[]; + isUpdate: boolean; +} | { + service: {}; + list: never[]; + serviceCode?: undefined; + isUpdate?: undefined; +}>; diff --git a/packages/vite-plugin/dist/file/index.d.ts b/packages/vite-plugin/dist/file/index.d.ts new file mode 100644 index 0000000..c96a4b3 --- /dev/null +++ b/packages/vite-plugin/dist/file/index.d.ts @@ -0,0 +1,6 @@ +interface Item { + path: string; + code: string; +} +export declare function createFile(data: Item | Item[]): Promise; +export {}; diff --git a/packages/vite-plugin/dist/index.d.ts b/packages/vite-plugin/dist/index.d.ts new file mode 100644 index 0000000..007de2c --- /dev/null +++ b/packages/vite-plugin/dist/index.d.ts @@ -0,0 +1,2 @@ +import type { Config } from "../types"; +export declare function cool(options: Config.Options): (import("vite").Plugin | Promise> | Promise[]>)[]; diff --git a/packages/vite-plugin/dist/index.js b/packages/vite-plugin/dist/index.js new file mode 100644 index 0000000..9d64378 --- /dev/null +++ b/packages/vite-plugin/dist/index.js @@ -0,0 +1,2505 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('fs'), require('path'), require('prettier'), require('axios'), require('lodash'), require('@vue/compiler-sfc'), require('magic-string'), require('glob'), require('node:util'), require('svgo'), require('postcss-value-parser')) : + typeof define === 'function' && define.amd ? define(['exports', 'fs', 'path', 'prettier', 'axios', 'lodash', '@vue/compiler-sfc', 'magic-string', 'glob', 'node:util', 'svgo', 'postcss-value-parser'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.index = {}, global.fs, global.path, global.prettier, global.axios, global.lodash, global.compilerSfc, global.magicString, global.glob, global.util, global.svgo, global.valueParser)); +})(this, (function (exports, fs, path, prettier, axios, lodash, compilerSfc, magicString, glob, util, svgo, valueParser) { 'use strict'; + + const config = { + type: "admin", + reqUrl: "", + nameTag: true, + eps: { + enable: true, + api: "", + dist: "./build/cool", + mapping: [ + { + // 自定义匹配 + custom: ({ propertyName, type }) => { + // 如果没有,返回null或者不返回,则继续遍历其他匹配规则 + return null; + }, + }, + { + type: "string", + test: ["varchar", "text", "simple-json"], + }, + { + type: "string[]", + test: ["simple-array"], + }, + { + type: "Date", + test: ["datetime", "date"], + }, + { + type: "number", + test: ["tinyint", "int", "decimal"], + }, + { + type: "BigInt", + test: ["bigint"], + }, + { + type: "any", + test: ["json"], + }, + ], + }, + svg: { + skipNames: ["base"], + }, + tailwind: { + enable: true, + remUnit: 14, + remPrecision: 6, + rpxRatio: 2, + darkTextClass: "dark:text-surface-50", + }, + uniapp: { + isPlugin: false, + }, + clean: false, + utsPlatform: "web", + }; + + // 根目录 + function rootDir(path$1) { + switch (config.type) { + case "app": + case "uniapp-x": + return path.join(process.env.UNI_INPUT_DIR, path$1); + default: + return path.join(process.cwd(), path$1); + } + } + // 首字母大写 + function firstUpperCase(value) { + return value.replace(/\b(\w)(\w*)/g, function ($0, $1, $2) { + return $1.toUpperCase() + $2; + }); + } + // 横杠转驼峰 + function toCamel(str) { + return str.replace(/([^-])(?:-+([^-]))/g, function ($0, $1, $2) { + return $1 + $2.toUpperCase(); + }); + } + // 创建目录 + function createDir(path, recursive) { + try { + if (!fs.existsSync(path)) + fs.mkdirSync(path, { recursive }); + } + catch (err) { } + } + // 读取文件 + function readFile(path, json) { + try { + const content = fs.readFileSync(path, "utf8"); + return json ? JSON.parse(removeJsonComments(content)) : content; + } + catch (err) { } + return ""; + } + // 安全地移除JSON中的注释 + function removeJsonComments(content) { + let result = ""; + let inString = false; + let stringChar = ""; + let escaped = false; + let i = 0; + while (i < content.length) { + const char = content[i]; + const nextChar = content[i + 1]; + // 处理字符串状态 + if (!inString && (char === '"' || char === "'")) { + inString = true; + stringChar = char; + result += char; + } + else if (inString && char === stringChar && !escaped) { + inString = false; + stringChar = ""; + result += char; + } + else if (inString) { + // 在字符串内,直接添加字符 + result += char; + escaped = char === "\\" && !escaped; + } + else { + // 不在字符串内,检查注释 + if (char === "/" && nextChar === "/") { + // 单行注释,跳过到行尾 + while (i < content.length && content[i] !== "\n") { + i++; + } + if (i < content.length) { + result += content[i]; // 保留换行符 + } + } + else if (char === "/" && nextChar === "*") { + // 多行注释,跳过到 */ + i += 2; + while (i < content.length - 1) { + if (content[i] === "*" && content[i + 1] === "/") { + i += 2; + break; + } + i++; + } + continue; + } + else { + result += char; + escaped = false; + } + } + i++; + } + return result; + } + // 写入文件 + function writeFile(path, data) { + try { + return fs.writeFileSync(path, data); + } + catch (err) { } + return ""; + } + // 解析body + function parseJson(req) { + return new Promise((resolve) => { + let d = ""; + req.on("data", function (chunk) { + d += chunk; + }); + req.on("end", function () { + try { + resolve(JSON.parse(d)); + } + catch { + resolve({}); + } + }); + }); + } + // 格式化内容 + function formatContent(content, options) { + return prettier.format(content, { + parser: "typescript", + useTabs: true, + tabWidth: 4, + endOfLine: "lf", + semi: true, + ...options, + }); + } + function error(message) { + console.log("\x1B[31m%s\x1B[0m", message); + } + + /** + * 将模板字符串扁平化处理,转换为 Service 类型定义 + * @param template - 包含 Service 类型定义的模板字符串 + * @returns 处理后的 Service 类型定义字符串 + * @throws {Error} 当模板中找不到 Service 类型定义时抛出错误 + */ + function flatten(template) { + // 查找 Service 类型定义的起始位置 + const startIndex = template.indexOf("export type Service = {"); + // 保留 Service 类型定义前的内容 + let header = template.substring(0, startIndex); + // 获取 Service 类型定义及其内容,去除换行和制表符 + const serviceTemplateContent = template.substring(startIndex).replace(/\n|\t/g, ""); + // 找到 Service 的内容部分 + const serviceStartIndex = serviceTemplateContent.indexOf("{") + 1; + const serviceEndIndex = findClosingBrace(serviceTemplateContent, serviceStartIndex); + const serviceInnerContent = serviceTemplateContent + .substring(serviceStartIndex, serviceEndIndex) + .trim(); + // 存储所有接口定义 + const allInterfaces = new Map(); + // 处理 Service 内容,保持原有结构但替换嵌套对象为接口引用 + const serviceContent = buildCurrentLevelContent(serviceInnerContent); + // 递归收集所有需要生成的接口 + flattenContent(serviceInnerContent, allInterfaces); + // 生成所有接口定义 + let interfaces = ""; + allInterfaces.forEach((content, key) => { + interfaces += `\nexport interface ${firstUpperCase(key)}Interface { ${content} }\n`; + }); + return `${header}${interfaces}\nexport type Service = { ${serviceContent} }`; + } + /** + * 查找匹配的右花括号位置 + * @param str - 要搜索的字符串 + * @param startIndex - 开始搜索的位置 + * @returns 匹配的右花括号位置 + * @throws {Error} 当找不到匹配的右花括号时抛出错误 + */ + function findClosingBrace(str, startIndex) { + let braceCount = 1; + let currentIndex = startIndex; + while (currentIndex < str.length && braceCount > 0) { + if (str[currentIndex] === "{") + braceCount++; + if (str[currentIndex] === "}") + braceCount--; + currentIndex++; + } + if (braceCount !== 0) { + throw new Error("Unmatched braces in the template"); + } + return currentIndex - 1; + } + /** + * 递归收集所有需要生成的接口 + * @param content - 要处理的内容 + * @param allInterfaces - 存储所有接口定义的 Map + * @param parentFields - 父级字段数组(暂未使用) + */ + function flattenContent(content, allInterfaces, parentFields) { + const interfacePattern = /(\w+)\s*:\s*\{/g; + let match; + while ((match = interfacePattern.exec(content)) !== null) { + const key = match[1]; + const startIndex = match.index + match[0].length; + const endIndex = findClosingBrace(content, startIndex); + if (endIndex > startIndex) { + const innerContent = content.substring(startIndex, endIndex).trim(); + // 构建当前接口的内容,将嵌套对象替换为接口引用 + const currentLevelContent = buildCurrentLevelContent(innerContent); + allInterfaces.set(key, currentLevelContent); + // 递归处理嵌套内容 + flattenContent(innerContent, allInterfaces); + } + } + } + /** + * 构建当前级别的内容,将嵌套对象替换为接口引用 + * @param content - 内容字符串 + * @returns 处理后的内容 + */ + function buildCurrentLevelContent(content) { + const interfacePattern = /(\w+)\s*:\s*\{/g; + let result = content; + let match; + // 重置正则表达式的 lastIndex + interfacePattern.lastIndex = 0; + while ((match = interfacePattern.exec(content)) !== null) { + const key = match[1]; + const startIndex = match.index + match[0].length; + const endIndex = findClosingBrace(content, startIndex); + if (endIndex > startIndex) { + const fullMatch = content.substring(match.index, endIndex + 1); + const replacement = `${key}: ${firstUpperCase(key)}Interface;`; + result = result.replace(fullMatch, replacement); + } + } + // 清理多余的分号和空格 + result = result.replace(/;+/g, ";").replace(/\s+/g, " ").trim(); + return result; + } + + /** + * 获取动态类名 + */ + const getDynamicClassNames = (value) => { + const names = new Set(); + // 匹配函数调用中的对象参数(如 parseClass({'!bg-surface-50': hoverable})) + const functionCallRegex = /\w+\s*\(\s*\{([^}]*)\}\s*\)/gs; + let funcMatch; + while ((funcMatch = functionCallRegex.exec(value)) !== null) { + const objContent = funcMatch[1]; + // 提取对象中的键 + const keyRegex = /['"](.*?)['"]\s*:/gs; + let keyMatch; + while ((keyMatch = keyRegex.exec(objContent)) !== null) { + keyMatch[1].trim() && names.add(keyMatch[1]); + } + } + // 匹配对象键(如 { 'text-a': 1 })- 优化版本,避免跨行错误匹配 + const objKeyRegex = /[{,]\s*['"](.*?)['"]\s*:/gs; + let objKeyMatch; + while ((objKeyMatch = objKeyRegex.exec(value)) !== null) { + const className = objKeyMatch[1].trim(); + // 确保是有效的CSS类名,避免匹配到错误内容 + if (className && !className.includes("\n") && !className.includes("\t")) { + names.add(className); + } + } + // 匹配数组中的字符串元素(如 'text-center')- 优化版本 + const arrayStringRegex = /(?:^|[,\[\s])\s*['"](.*?)['"]/gs; + let arrayMatch; + while ((arrayMatch = arrayStringRegex.exec(value)) !== null) { + const className = arrayMatch[1].trim(); + // 确保是有效的CSS类名 + if (className && !className.includes("\n") && !className.includes("\t")) { + names.add(className); + } + } + // 匹配三元表达式中的字符串(如 'dark' 和 'light') + const ternaryRegex = /(\?|:)\s*['"](.*?)['"]/gs; + let ternaryMatch; + while ((ternaryMatch = ternaryRegex.exec(value)) !== null) { + ternaryMatch[2].trim() && names.add(ternaryMatch[2]); + } + // 匹配反引号模板字符串 - 改进版本 + const templateRegex = /`([^`]*)`/gs; + let templateMatch; + while ((templateMatch = templateRegex.exec(value)) !== null) { + const templateContent = templateMatch[1]; + // 提取模板字符串中的普通文本部分(排除 ${} 表达式) + const textParts = templateContent.split(/\$\{[^}]*\}/); + textParts.forEach((part) => { + part.trim() + .split(/\s+/) + .forEach((className) => { + className.trim() && names.add(className.trim()); + }); + }); + // 提取模板字符串中 ${} 表达式内的字符串 + const expressionRegex = /\$\{([^}]*)\}/gs; + let expressionMatch; + while ((expressionMatch = expressionRegex.exec(templateContent)) !== null) { + const expression = expressionMatch[1]; + // 递归处理表达式中的动态类名 + getDynamicClassNames(expression).forEach((name) => names.add(name)); + } + } + // 处理混合字符串(模板字符串 + 普通文本),如 "`text-red-900` text-red-1000" + const mixedStringRegex = /`[^`]*`\s+([a-zA-Z0-9\-_\s]+)/g; + let mixedMatch; + while ((mixedMatch = mixedStringRegex.exec(value)) !== null) { + const additionalClasses = mixedMatch[1].trim().split(/\s+/); + additionalClasses.forEach((className) => { + className.trim() && names.add(className.trim()); + }); + } + // 处理普通字符串,多个类名用空格分割 + const stringRegex = /['"]([\w\s\-!:\/]+?)['"]/gs; + let stringMatch; + while ((stringMatch = stringRegex.exec(value)) !== null) { + const classNames = stringMatch[1].trim().split(/\s+/); + classNames.forEach((className) => { + className.trim() && names.add(className.trim()); + }); + } + return Array.from(names); + }; + /** + * 获取类名 + */ + function getClassNames(code) { + // 修改正则表达式以支持多行匹配,避免内层引号冲突 + const classRegex = /(?:class|:class|:pt|:hover-class)\s*=\s*(['"`])((?:[^'"`\\]|\\.|`[^`]*`|'[^']*'|"[^"]*")*?)\1/gis; + const classNames = new Set(); + let match; + while ((match = classRegex.exec(code)) !== null) { + const attribute = match[0].split("=")[0].trim(); + const isStaticClass = attribute === "class" || attribute === "hover-class"; + const isPtAttribute = attribute.includes("pt"); + const value = match[2].trim(); + if (isStaticClass) { + // 处理静态 class 和 hover-class + value.split(/\s+/).forEach((name) => name && classNames.add(name)); + } + else if (isPtAttribute) { + // 处理 :pt 属性中的 className + parseClasNameFromPt(value, classNames); + } + else { + // 处理动态 :class 和 :hover-class + getDynamicClassNames(value).forEach((name) => classNames.add(name)); + } + } + return Array.from(classNames); + } + /** + * 从 :pt 属性中解析 className + */ + function parseClasNameFromPt(value, classNames) { + // 递归查找所有 className 属性 + const classNameRegex = /className\s*:\s*/g; + let match; + while ((match = classNameRegex.exec(value)) !== null) { + const startPos = match.index + match[0].length; + const classNameValue = extractComplexValue(value, startPos); + if (classNameValue) { + // 如果是字符串字面量 + if (classNameValue.startsWith('"') || + classNameValue.startsWith("'") || + classNameValue.startsWith("`")) { + if (classNameValue.startsWith("`")) { + // 处理模板字符串 + getDynamicClassNames(classNameValue).forEach((name) => classNames.add(name)); + } + else { + // 处理普通字符串 + const strMatch = classNameValue.match(/['"](.*?)['"]/); + if (strMatch) { + strMatch[1].split(/\s+/).forEach((name) => name && classNames.add(name)); + } + } + } + else { + // 处理动态值(如函数调用、对象等) + getDynamicClassNames(classNameValue).forEach((name) => classNames.add(name)); + } + } + } + } + /** + * 提取复杂值(支持嵌套引号和括号) + */ + function extractComplexValue(text, startPos) { + let pos = startPos; + let depth = 0; + let inString = false; + let stringChar = ""; + let result = ""; + // 跳过开头的空白字符 + while (pos < text.length && /\s/.test(text[pos])) { + pos++; + } + while (pos < text.length) { + const char = text[pos]; + if (!inString) { + if (char === '"' || char === "'" || char === "`") { + inString = true; + stringChar = char; + result += char; + } + else if (char === "{" || char === "(" || char === "[") { + depth++; + result += char; + } + else if (char === "}" || char === ")" || char === "]") { + if (depth === 0 && char === "}") { + // 遇到顶层的 } 时结束 + break; + } + depth--; + result += char; + } + else if (char === "," && depth === 0) { + // 遇到顶层的逗号时结束 + break; + } + else if (char === "\n" && depth === 0 && result.trim() !== "") { + // 如果遇到换行且不在嵌套结构中,且已有内容,则结束 + break; + } + else { + result += char; + } + } + else { + result += char; + if (char === stringChar && text[pos - 1] !== "\\") { + inString = false; + stringChar = ""; + // 如果字符串结束且depth为0,检查是否应该结束 + if (depth === 0) { + // 看看下一个非空白字符是什么 + let nextPos = pos + 1; + while (nextPos < text.length && /\s/.test(text[nextPos])) { + nextPos++; + } + if (nextPos < text.length && (text[nextPos] === "," || text[nextPos] === "}")) { + // 如果下一个字符是逗号或右括号,则结束 + break; + } + } + } + } + pos++; + } + return result.trim() || null; + } + /** + * 获取 class 内容 + */ + function getClassContent(code) { + // 修改正则表达式以支持多行匹配,避免内层引号冲突 + const regex = /(?:class|:class|:pt|:hover-class)\s*=\s*(['"`])((?:[^'"`\\]|\\.|`[^`]*`|'[^']*'|"[^"]*")*?)\1/gis; + const texts = []; + let match; + while ((match = regex.exec(code)) !== null) { + const attribute = match[0].split("=")[0].trim(); + const isPtAttribute = attribute.includes("pt"); + const value = match[2]; + if (isPtAttribute) { + // 手动解析 className 值 + const classNameRegex = /className\s*:\s*/g; + let classNameMatchResult; + while ((classNameMatchResult = classNameRegex.exec(value)) !== null) { + const startPos = classNameMatchResult.index + classNameMatchResult[0].length; + const classNameValue = extractComplexValue(value, startPos); + if (classNameValue) { + texts.push(classNameValue); + } + } + } + else { + texts.push(value); + } + } + return texts; + } + /** + * 获取节点 + */ + function getNodes(code) { + const nodes = []; + // 找到所有顶级template标签的完整内容 + function findTemplateContents(content) { + const results = []; + let index = 0; + while (index < content.length) { + const templateStart = content.indexOf("", templateStart); + if (tagEnd === -1) + break; + // 使用栈来匹配配对的template标签 + let stack = 1; + let currentPos = tagEnd + 1; + while (currentPos < content.length && stack > 0) { + const nextTemplateStart = content.indexOf("", currentPos); + if (nextTemplateEnd === -1) + break; + // 如果开始标签更近,说明有嵌套 + if (nextTemplateStart !== -1 && nextTemplateStart < nextTemplateEnd) { + // 找到开始标签的完整结束 + const nestedTagEnd = content.indexOf(">", nextTemplateStart); + if (nestedTagEnd !== -1) { + stack++; + currentPos = nestedTagEnd + 1; + } + else { + break; + } + } + else { + // 找到结束标签 + stack--; + currentPos = nextTemplateEnd + 11; // ''.length + } + } + if (stack === 0) { + // 提取template内容(不包括template标签本身) + const templateContent = content.substring(tagEnd + 1, currentPos - 11); + results.push(templateContent); + index = currentPos; + } + else { + // 如果没有找到匹配的结束标签,跳过这个开始标签 + index = tagEnd + 1; + } + } + return results; + } + // 递归提取所有template内容中的节点 + function extractNodesFromContent(content) { + // 先提取当前内容中的所有标签 + const regex = /<([^>]+)>/g; + let match; + while ((match = regex.exec(content)) !== null) { + if (!match[1].startsWith("/") && !match[1].startsWith("template")) { + nodes.push(match[1]); + } + } + // 递归处理嵌套的template + const nestedTemplates = findTemplateContents(content); + nestedTemplates.forEach((templateContent) => { + extractNodesFromContent(templateContent); + }); + } + // 获取所有顶级template内容 + const templateContents = findTemplateContents(code); + // 处理每个template内容 + templateContents.forEach((templateContent) => { + extractNodesFromContent(templateContent); + }); + return nodes.map((e) => `<${e}>`); + } + /** + * 添加 script 标签内容 + */ + function addScriptContent(code, content) { + const scriptMatch = /]*>([\s\S]*?)<\/script>/g.exec(code); + if (!scriptMatch) { + return code; + } + const scriptContent = scriptMatch[1]; + const scriptStartIndex = scriptMatch.index + scriptMatch[0].indexOf(">") + 1; + const scriptEndIndex = scriptStartIndex + scriptContent.length; + return (code.substring(0, scriptStartIndex) + + "\n" + + content + + "\n" + + scriptContent.trim() + + code.substring(scriptEndIndex)); + } + /** + * 判断是否为 Tailwind 类名 + */ + function isTailwindClass(className) { + const prefixes = [ + // 布局 + "container", + "flex", + "grid", + "block", + "inline", + "hidden", + "visible", + // 间距 + "p-", + "px-", + "py-", + "pt-", + "pr-", + "pb-", + "pl-", + "m-", + "mx-", + "my-", + "mt-", + "mr-", + "mb-", + "ml-", + "space-", + "gap-", + // 尺寸 + "w-", + "h-", + "min-w-", + "max-w-", + "min-h-", + "max-h-", + // 颜色 + "bg-", + "text-", + "border-", + "ring-", + "shadow-", + // 边框 + "border", + "rounded", + "ring", + // 字体 + "font-", + "text-", + "leading-", + "tracking-", + "antialiased", + // 定位 + "absolute", + "relative", + "fixed", + "sticky", + "static", + "top-", + "right-", + "bottom-", + "left-", + "inset-", + "z-", + // 变换 + "transform", + "translate-", + "rotate-", + "scale-", + "skew-", + // 过渡 + "transition", + "duration-", + "ease-", + "delay-", + // 交互 + "cursor-", + "select-", + "pointer-events-", + // 溢出 + "overflow-", + "truncate", + // 滚动 + "scroll-", + // 伪类和响应式 + "hover:", + "focus:", + "active:", + "disabled:", + "group-hover:", + ]; + const statePrefixes = ["dark:", "dark:!", "light:", "sm:", "md:", "lg:", "xl:", "2xl:"]; + if (className.startsWith("!") && !className.includes("!=")) { + return true; + } + for (const prefix of prefixes) { + if (className.startsWith(prefix)) { + return true; + } + for (const statePrefix of statePrefixes) { + if (className.startsWith(statePrefix + prefix)) { + return true; + } + } + } + return false; + } + /** + * 将 interface 转换为 type + */ + function interfaceToType(code) { + // 匹配 interface 定义 + const interfaceRegex = /interface\s+(\w+)(\s*extends\s+\w+)?\s*\{([^}]*)\}/g; + // 将 interface 转换为 type + return code.replace(interfaceRegex, (match, name, extends_, content) => { + // 处理可能存在的 extends + const extendsStr = extends_ ? extends_ : ""; + // 返回转换后的 type 定义 + return `type ${name}${extendsStr} = {${content}}`; + }); + } + + // 全局 service 对象,用于存储服务结构 + const service = {}; + // eps 实体列表 + let list = []; + /** + * 获取 eps 请求地址 + * @returns {string} eps url + */ + function getEpsUrl() { + let url = config.eps.api; + if (!url) { + url = config.type; + } + switch (url) { + case "app": + case "uniapp-x": + url = "/app/base/comm/eps"; + break; + case "admin": + url = "/admin/base/open/eps"; + break; + } + return url; + } + /** + * 获取 eps 路径 + * @param filename 文件名 + * @returns {string} 完整路径 + */ + function getEpsPath(filename) { + return path.join(config.type == "admin" ? config.eps.dist : rootDir(config.eps.dist), filename || ""); + } + /** + * 获取对象方法名(排除 namespace、permission 字段) + * @param v 对象 + * @returns {string[]} 方法名数组 + */ + function getNames(v) { + return Object.keys(v).filter((e) => !["namespace", "permission"].includes(e)); + } + /** + * 获取字段类型 + */ + function getType({ propertyName, type }) { + for (const map of config.eps.mapping) { + if (map.custom) { + const resType = map.custom({ propertyName, type }); + if (resType) + return resType; + } + if (map.test) { + if (map.test.includes(type)) + return map.type; + } + } + return type; + } + /** + * 格式化方法名,去除特殊字符 + */ + function formatName(name) { + return (name || "").replace(/[:,\s,\/,-]/g, ""); + } + /** + * 检查方法名是否合法(不包含特殊字符) + */ + function checkName(name) { + return name && !["{", "}", ":"].some((e) => name.includes(e)); + } + /** + * 不支持 uniapp-x 平台显示 + */ + function noUniappX(text, defaultText = "") { + if (config.type == "uniapp-x") { + return defaultText; + } + else { + return text; + } + } + /** + * 查找字段 + * @param sources 字段 source 数组 + * @param item eps 实体 + * @returns {Eps.Column[]} 字段数组 + */ + function findColumns(sources, item) { + const columns = [item.columns, item.pageColumns].flat().filter(Boolean); + return (sources || []) + .map((e) => columns.find((c) => c.source == e)) + .filter(Boolean); + } + /** + * 使用 prettier 格式化 TypeScript 代码 + * @param text 代码文本 + * @returns {Promise} 格式化后的代码 + */ + async function formatCode(text) { + return prettier + .format(text, { + parser: "typescript", + useTabs: true, + tabWidth: 4, + endOfLine: "lf", + semi: true, + singleQuote: false, + printWidth: 100, + trailingComma: "none", + }) + .catch((err) => { + console.log(err); + error(`[cool-eps] File format error, please try again`); + return null; + }); + } + /** + * 获取 eps 数据(本地优先,远程兜底) + */ + async function getData() { + // 读取本地 eps.json + list = readFile(getEpsPath("eps.json"), true) || []; + // 拼接请求地址 + const url = config.reqUrl + getEpsUrl(); + // 请求远程 eps 数据 + await axios + .get(url, { + timeout: 5000, + }) + .then((res) => { + const { code, data, message } = res.data; + if (code === 1000) { + if (!lodash.isEmpty(data) && data) { + list = lodash.values(data).flat(); + } + } + else { + error(`[cool-eps] ${message || "Failed to fetch data"}`); + } + }) + .catch(() => { + error(`[cool-eps] API service is not running → ${url}`); + }); + // 初始化处理,补全缺省字段 + list.forEach((e) => { + if (!e.namespace) + e.namespace = ""; + if (!e.api) + e.api = []; + if (!e.columns) + e.columns = []; + if (!e.search) { + e.search = { + fieldEq: findColumns(e.pageQueryOp?.fieldEq, e), + fieldLike: findColumns(e.pageQueryOp?.fieldLike, e), + keyWordLikeFields: findColumns(e.pageQueryOp?.keyWordLikeFields, e), + }; + } + }); + if (config.type == "uniapp-x" || config.type == "app") { + list = list.filter((e) => e.prefix.startsWith("/app") || e.prefix.startsWith("/admin")); + } + } + /** + * 创建 eps.json 文件 + * @returns {boolean} 是否有更新 + */ + function createJson() { + let data = []; + if (config.type != "uniapp-x") { + data = list.map((e) => { + return { + prefix: e.prefix, + name: e.name || "", + api: e.api.map((apiItem) => ({ + name: apiItem.name, + method: apiItem.method, + path: apiItem.path, + })), + search: e.search, + }; + }); + } + else { + data = list; + } + const content = JSON.stringify(data); + const local_content = readFile(getEpsPath("eps.json")); + // 判断是否需要更新 + const isUpdate = content != local_content; + if (isUpdate) { + fs.createWriteStream(getEpsPath("eps.json"), { + flags: "w", + }).write(content); + } + return isUpdate; + } + /** + * 创建 eps 类型描述文件(d.ts/ts) + * @param param0 list: eps实体列表, service: service对象 + */ + async function createDescribe({ list, service }) { + /** + * 创建 Entity 接口定义 + */ + function createEntity() { + const ignore = []; + let t0 = ""; + for (const item of list) { + if (!checkName(item.name)) + continue; + if (formatName(item.name) == "BusinessInterface") { + console.log(111); + } + let t = `interface ${formatName(item.name)} {`; + // 合并 columns 和 pageColumns,去重 + const columns = lodash.uniqBy(lodash.compact([...(item.columns || []), ...(item.pageColumns || [])]), "source"); + for (const col of columns || []) { + t += ` + /** + * ${col.comment} + */ + ${col.propertyName}?: ${getType({ + propertyName: col.propertyName, + type: col.type, + })}; + `; + } + t += ` + /** + * 任意键值 + */ + [key: string]: any; + } + `; + if (!ignore.includes(item.name)) { + ignore.push(item.name); + t0 += t + "\n\n"; + } + } + return t0; + } + /** + * 创建 Controller 接口定义 + */ + async function createController() { + let controller = ""; + let chain = ""; + let pageResponse = ""; + /** + * 递归处理 service 树,生成接口定义 + * @param d 当前节点 + * @param k 前缀 + */ + function deep(d, k) { + if (!k) + k = ""; + for (const i in d) { + const name = k + toCamel(firstUpperCase(formatName(i))); + // 检查方法名 + if (!checkName(name)) + continue; + if (d[i].namespace) { + // 查找配置 + const item = list.find((e) => (e.prefix || "") === `/${d[i].namespace}`); + if (item) { + // + let t = `interface ${name} {`; + // 插入方法 + if (item.api) { + // 权限列表 + const permission = []; + item.api.forEach((a) => { + // 方法名 + const n = toCamel(formatName(a.name || lodash.last(a.path.split("/")))); + // 检查方法名 + if (!checkName(n)) + return; + if (n) { + // 参数类型 + let q = []; + // 参数列表 + const { parameters = [] } = a.dts || {}; + parameters.forEach((p) => { + if (p.description) { + q.push(`\n/** ${p.description} */\n`); + } + // 检查参数名 + if (!checkName(p.name)) { + return false; + } + const a = `${p.name}${p.required ? "" : "?"}`; + const b = `${p.schema.type || "string"}`; + q.push(`${a}: ${b};`); + }); + if (lodash.isEmpty(q)) { + q = ["any"]; + } + else { + q.unshift("{"); + q.push("}"); + } + // 返回类型 + let res = ""; + // 实体名 + const en = item.name || "any"; + switch (a.path) { + case "/page": + res = `${name}PageResponse`; + pageResponse += ` + interface ${name}PageResponse { + pagination: PagePagination; + list: ${en}[]; + } + `; + break; + case "/list": + res = `${en} []`; + break; + case "/info": + res = en; + break; + default: + res = "any"; + break; + } + // 方法描述 + if (config.type == "uniapp-x") { + t += ` + /** + * ${a.summary || n} + */ + ${n}(data${q.length == 1 ? "?" : ""}: ${q.join("")}): Promise; + `; + } + else { + t += ` + /** + * ${a.summary || n} + */ + ${n}(data${q.length == 1 ? "?" : ""}: ${q.join("")}): Promise<${res}>; + `; + } + if (!permission.includes(n)) { + permission.push(n); + } + } + }); + // 权限标识 + t += noUniappX(` + /** + * 权限标识 + */ + permission: { ${permission.map((e) => `${e}: string;`).join("\n")} }; + `); + // 权限状态 + t += noUniappX(` + /** + * 权限状态 + */ + _permission: { ${permission.map((e) => `${e}: boolean;`).join("\n")} }; + `); + // 请求 + t += noUniappX(` + request: Request; + `); + } + t += "}\n\n"; + controller += t; + chain += `${formatName(i)}: ${name};`; + } + } + else { + chain += `${formatName(i)}: {`; + deep(d[i], name); + chain += "};"; + } + } + } + // 遍历 service 树 + deep(service); + return ` + type json = any; + + ${await createDict()} + + interface PagePagination { + size: number; + page: number; + total: number; + [key: string]: any; + }; + + interface PageResponse { + pagination: PagePagination; + list: T[]; + [key: string]: any; + }; + + ${pageResponse} + + ${controller} + + ${noUniappX(`interface RequestOptions { + url: string; + method?: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT'; + data?: any; + params?: any; + headers?: any; + timeout?: number; + [key: string]: any; + }`)} + + ${noUniappX("type Request = (options: RequestOptions) => Promise;")} + + type Service = { + ${noUniappX("request: Request;")} + + ${chain} + } + `; + } + // 组装文件内容 + let text = ` + ${createEntity()} + ${await createController()} + `; + // 文件名 + let name = "eps.d.ts"; + if (config.type == "uniapp-x") { + name = "eps.ts"; + text = text + .replaceAll("interface ", "export interface ") + .replaceAll("type ", "export type ") + .replaceAll("[key: string]: any;", ""); + text = flatten(text); + text = interfaceToType(text); + } + else { + text = ` + declare namespace Eps { + ${text} + } + `; + } + // 格式化文本内容 + const content = await formatCode(text); + const local_content = readFile(getEpsPath(name)); + // 是否需要更新 + if (content && content != local_content && list.length > 0) { + // 创建 eps 描述文件 + fs.createWriteStream(getEpsPath(name), { + flags: "w", + }).write(content); + } + } + /** + * 构建 service 对象树 + */ + function createService() { + // 路径第一层作为 id 标识 + const id = getEpsUrl().split("/")[1]; + list.forEach((e) => { + // 请求地址 + const path = e.prefix[0] == "/" ? e.prefix.substring(1, e.prefix.length) : e.prefix; + // 分隔路径,去除 id,转驼峰 + const arr = path.replace(id, "").split("/").filter(Boolean).map(toCamel); + /** + * 递归构建 service 树 + * @param d 当前节点 + * @param i 当前索引 + */ + function deep(d, i) { + const k = arr[i]; + if (k) { + // 是否最后一个 + if (arr[i + 1]) { + if (!d[k]) { + d[k] = {}; + } + deep(d[k], i + 1); + } + else { + // 不存在则创建 + if (!d[k]) { + d[k] = { + permission: {}, + }; + } + if (!d[k].namespace) { + d[k].namespace = path; + } + // 创建权限 + if (d[k].namespace) { + getNames(d[k]).forEach((i) => { + d[k].permission[i] = + `${d[k].namespace.replace(`${id}/`, "")}/${i}`.replace(/\//g, ":"); + }); + } + // 创建搜索 + d[k].search = e.search; + // 创建方法 + e.api.forEach((a) => { + // 方法名 + const n = a.path.replace("/", ""); + if (n && !/[-:]/g.test(n)) { + d[k][n] = a; + } + }); + } + } + } + deep(service, 0); + }); + } + /** + * 创建 service 代码 + * @returns {string} service 代码 + */ + function createServiceCode() { + const types = []; + let chain = ""; + /** + * 递归处理 service 树,生成接口代码 + * @param d 当前节点 + * @param k 前缀 + */ + function deep(d, k) { + if (!k) + k = ""; + for (const i in d) { + if (["swagger"].includes(i)) { + continue; + } + const name = k + toCamel(firstUpperCase(formatName(i))); + // 检查方法名 + if (!checkName(name)) + continue; + if (d[i].namespace) { + // 查找配置 + const item = list.find((e) => (e.prefix || "") === `/${d[i].namespace}`); + if (item) { + // + let t = `{`; + // 插入方法 + if (item.api) { + item.api.forEach((a) => { + // 方法名 + const n = toCamel(formatName(a.name || lodash.last(a.path.split("/")))); + // 检查方法名 + if (!checkName(n)) + return; + if (n) { + // 参数类型 + let q = []; + // 参数列表 + const { parameters = [] } = a.dts || {}; + parameters.forEach((p) => { + if (p.description) { + q.push(`\n/** ${p.description} */\n`); + } + // 检查参数名 + if (!checkName(p.name)) { + return false; + } + const a = `${p.name}${p.required ? "" : "?"}`; + const b = `${p.schema.type || "string"}`; + q.push(`${a}: ${b}, `); + }); + if (lodash.isEmpty(q)) { + q = ["any"]; + } + else { + q.unshift("{"); + q.push("}"); + } + if (item.name) { + types.push(item.name); + } + // 方法描述 + t += ` + /** + * ${a.summary || n} + */ + ${n}(data?: any): Promise { + return request({ + url: "/${d[i].namespace}${a.path}", + method: "${(a.method || "get").toLocaleUpperCase()}", + data, + }); + }, + `; + } + }); + } + t += `} as ${name}\n`; + types.push(name); + chain += `${formatName(i)}: ${t},\n`; + } + } + else { + chain += `${formatName(i)}: {`; + deep(d[i], name); + chain += `} as ${firstUpperCase(i)}Interface,`; + types.push(`${firstUpperCase(i)}Interface`); + } + } + } + // 遍历 service 树 + deep(service); + return { + content: `{ ${chain} }`, + types, + }; + } + /** + * 获取字典类型定义 + * @returns {Promise} 字典类型 type 定义 + */ + async function createDict() { + let p = ""; + switch (config.type) { + case "app": + case "uniapp-x": + p = "/app"; + break; + case "admin": + p = "/admin"; + break; + } + const url = config.reqUrl + p + "/dict/info/types"; + const text = await axios + .get(url) + .then((res) => { + const { code, data } = res.data; + if (code === 1000) { + let v = "string"; + if (!lodash.isEmpty(data)) { + v = data.map((e) => `"${e.key}"`).join(" | "); + } + return `type DictKey = ${v}`; + } + }) + .catch(() => { + error(`[cool-eps] Error:${url}`); + }); + return text || ""; + } + /** + * 主入口:创建 eps 相关文件和 service + */ + async function createEps() { + if (config.eps.enable) { + // 获取 eps 数据 + await getData(); + // 构建 service 对象 + createService(); + const serviceCode = createServiceCode(); + // 创建 eps 目录 + createDir(getEpsPath(), true); + // 创建 eps.json 文件 + const isUpdate = createJson(); + // 创建类型描述文件 + createDescribe({ service, list }); + return { + service, + serviceCode, + list, + isUpdate, + }; + } + else { + return { + service: {}, + list: [], + }; + } + } + + function getPlugin(name) { + let code = readFile(rootDir(`./src/plugins/${name}/config.ts`)); + // 设置插件配置 + const set = (key, value) => { + const regex = new RegExp(`(return\\s*{[^}]*?\\b${key}\\b\\s*:\\s*)([^,}]+)`); + if (regex.test(code)) { + code = code.replace(regex, `$1${JSON.stringify(value)}`); + } + else { + const insertPos = code.indexOf("return {") + 8; + code = + code.slice(0, insertPos) + + `\n ${key}: ${JSON.stringify(value)},` + + code.slice(insertPos); + } + }; + // 保存插件配置 + const save = async () => { + const content = await formatContent(code); + writeFile(rootDir(`./src/plugins/${name}/config.ts`), content); + }; + return { + set, + save, + }; + } + // 修改插件 + async function updatePlugin(options) { + const plugin = getPlugin(options.name); + if (options.enable !== undefined) { + plugin.set("enable", options.enable); + } + await plugin.save(); + } + + function getPath() { + return rootDir(`.${config.type == "admin" ? "/src" : ""}/config/proxy.ts`); + } + async function updateProxy(data) { + let code = readFile(getPath()); + const regex = /const\s+value\s*=\s*['"]([^'"]+)['"]/; + if (regex.test(code)) { + code = code.replace(regex, `const value = '${data.name}'`); + } + writeFile(getPath(), code); + } + function getProxyTarget(proxy) { + const code = readFile(getPath()); + const regex = /const\s+value\s*=\s*['"]([^'"]+)['"]/; + const match = code.match(regex); + if (match) { + const value = match[1]; + try { + const { target, rewrite } = proxy[`/${value}/`]; + return target + rewrite(`/${value}`); + } + catch (err) { + error(`[cool-proxy] Error:${value} → ` + getPath()); + return ""; + } + } + } + + // 创建文件 + async function createFile(data) { + const list = lodash.isArray(data) ? data : [data]; + for (const item of list) { + const { path: path$1, code } = item; + // 格式化内容 + const content = await formatContent(code, { + parser: "vue", + }); + // 目录路径 + const dir = (path$1 || "").split("/"); + // 文件名 + const fname = dir.pop(); + // 源码路径 + const srcPath = `./src/${dir.join("/")}`; + // 创建目录 + createDir(srcPath, true); + // 创建文件 + fs.createWriteStream(path.join(srcPath, fname), { + flags: "w", + }).write(content); + } + } + + function createTag(code, id) { + if (/\.vue$/.test(id)) { + let s; + const str = () => s || (s = new magicString(code)); + const { descriptor } = compilerSfc.parse(code); + if (!descriptor.script && descriptor.scriptSetup) { + const res = compilerSfc.compileScript(descriptor, { id }); + const { name, lang } = res.attrs; + str().appendLeft(0, ` + + diff --git a/src/modules/base/pages/kefulogin/index.vue b/src/modules/base/pages/kefulogin/index.vue new file mode 100644 index 0000000..6129d52 --- /dev/null +++ b/src/modules/base/pages/kefulogin/index.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/src/modules/base/pages/login/components/pic-captcha.vue b/src/modules/base/pages/login/components/pic-captcha.vue new file mode 100644 index 0000000..87af631 --- /dev/null +++ b/src/modules/base/pages/login/components/pic-captcha.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/modules/base/pages/login/index.vue b/src/modules/base/pages/login/index.vue new file mode 100644 index 0000000..2a235b8 --- /dev/null +++ b/src/modules/base/pages/login/index.vue @@ -0,0 +1,307 @@ + + + + + diff --git a/src/modules/base/pages/login/static/bg.svg b/src/modules/base/pages/login/static/bg.svg new file mode 100644 index 0000000..a96530d --- /dev/null +++ b/src/modules/base/pages/login/static/bg.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + diff --git a/src/modules/base/pages/main/components/amenu.vue b/src/modules/base/pages/main/components/amenu.vue new file mode 100644 index 0000000..b34000d --- /dev/null +++ b/src/modules/base/pages/main/components/amenu.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/modules/base/pages/main/components/bmenu.tsx b/src/modules/base/pages/main/components/bmenu.tsx new file mode 100644 index 0000000..6f0be72 --- /dev/null +++ b/src/modules/base/pages/main/components/bmenu.tsx @@ -0,0 +1,153 @@ +import { defineComponent, h, watch } from 'vue'; +import { useBase } from '/$/base'; +import { useCool } from '/@/cool'; +import { debounce } from 'lodash-es'; + +export default defineComponent({ + name: 'b-menu', + + props: { + keyWord: String + }, + + setup(props) { + const { router, route, browser, refs, setRefs } = useCool(); + const { menu, app } = useBase(); + + // 页面跳转 + function onSelect(url: string) { + if (url != route.path) { + router.push(url); + } + + // 小屏下点击收起左侧菜单 + if (browser.isMini) { + app.fold(true); + } + } + + // 渲染子菜单 + function renderMenu() { + function deep(list: Menu.Item[], show?: boolean) { + const keyWord = props.keyWord?.toLowerCase() || ''; + + function filterMenu(item: Menu.Item): boolean { + if (!item.isShow) return false; + + if (show) { + return true; + } + + if (item.meta?.label?.toLowerCase().includes(keyWord)) return true; + + if (item.children) { + return item.children.some(filterMenu); + } + + return false; + } + + return list.filter(filterMenu).map(e => { + if (e.meta?.label?.toLowerCase().includes(keyWord)) { + show = true; + } + + const item = (e: Menu.Item) => { + const arr = [ + , + + {e.meta?.label} + + ]; + + if (e.type == 1 && e.badge) { + arr.push( +
+ {e.badge} +
+ ); + } + return arr; + }; + + if (e.type == 0) { + return h( + , + { + index: String(e.id), + key: e.id, + popperClass: 'app-slider__menu' + }, + { + title() { + return item(e); + }, + default() { + return deep(e.children || [], show); + } + } + ); + } else { + return h( + , + { + index: e.meta?.isHome ? '/' : e.path, + key: e.id + }, + { + default() { + return item(e); + } + } + ); + } + }); + } + + return deep(menu.list); + } + + // 展开所有 + const expand = debounce(() => { + if (!props.keyWord) { + return; + } + + const deep = (list: Menu.Item[]) => { + list.forEach(e => { + if (e.type == 0) { + try { + refs.menu?.open(String(e.id)); + } catch (err) { } + + if (e.children) { + deep(e.children); + } + } + }); + }; + + deep(menu.list); + }, 300); + + watch(() => props.keyWord, expand); + + return () => { + return ( +
+ + {renderMenu()} + +
+ ); + }; + } +}); diff --git a/src/modules/base/pages/main/components/global.vue b/src/modules/base/pages/main/components/global.vue new file mode 100644 index 0000000..7134814 --- /dev/null +++ b/src/modules/base/pages/main/components/global.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/modules/base/pages/main/components/process.vue b/src/modules/base/pages/main/components/process.vue new file mode 100644 index 0000000..cf82f72 --- /dev/null +++ b/src/modules/base/pages/main/components/process.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/src/modules/base/pages/main/components/route-nav.vue b/src/modules/base/pages/main/components/route-nav.vue new file mode 100644 index 0000000..54b9bfb --- /dev/null +++ b/src/modules/base/pages/main/components/route-nav.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/modules/base/pages/main/components/slider.vue b/src/modules/base/pages/main/components/slider.vue new file mode 100644 index 0000000..635262c --- /dev/null +++ b/src/modules/base/pages/main/components/slider.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/modules/base/pages/main/components/topbar.vue b/src/modules/base/pages/main/components/topbar.vue new file mode 100644 index 0000000..5559d13 --- /dev/null +++ b/src/modules/base/pages/main/components/topbar.vue @@ -0,0 +1,219 @@ + + + + + + + diff --git a/src/modules/base/pages/main/components/views.vue b/src/modules/base/pages/main/components/views.vue new file mode 100644 index 0000000..0ae0219 --- /dev/null +++ b/src/modules/base/pages/main/components/views.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/modules/base/pages/main/index.vue b/src/modules/base/pages/main/index.vue new file mode 100644 index 0000000..e078958 --- /dev/null +++ b/src/modules/base/pages/main/index.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/modules/base/static/css/index.scss b/src/modules/base/static/css/index.scss new file mode 100644 index 0000000..e31abc7 --- /dev/null +++ b/src/modules/base/static/css/index.scss @@ -0,0 +1,81 @@ +#app { + height: 100vh; + width: 100vw; + overflow: hidden; +} + +:root { + --bg-color: var(--el-fill-color-lighter); +} + +a { + text-decoration: none; +} + +input, +button { + outline: none; +} + +input { + &:-webkit-autofill { + box-shadow: 0 0 0px 1000px white inset; + } +} + +// scrollbar +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar:horizontal { + height: 6px; +} + +::-webkit-scrollbar-track { + border-radius: 10px; +} + +::-webkit-scrollbar-thumb { + background-color: #0003; + border-radius: 10px; + transition: all 0.2s ease-in-out; +} + +::-webkit-scrollbar-thumb:hover { + cursor: pointer; + background-color: #0000004d; +} + +.dark ::-webkit-scrollbar-thumb { + background-color: #fff3; +} + +.dark ::-webkit-scrollbar-thumb:hover { + background-color: #fff6; +} + +// custom +.cl-comm__icon { + display: flex; + align-items: center; + justify-content: center; + height: 26px; + width: 26px; + background-color: var(--el-bg-color); + border: 1px solid var(--el-fill-color-dark); + border-radius: 6px; + transition: all 0.2s ease-in-out; + outline: none; + cursor: pointer; + flex-shrink: 0; + + .cl-svg { + font-size: 16px; + color: var(--el-text-color-primary); + } + + &:hover { + background-color: var(--el-fill-color-light); + } +} diff --git a/src/modules/base/static/svg/amount.svg b/src/modules/base/static/svg/amount.svg new file mode 100644 index 0000000..78fae7f --- /dev/null +++ b/src/modules/base/static/svg/amount.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/back.svg b/src/modules/base/static/svg/back.svg new file mode 100644 index 0000000..1212879 --- /dev/null +++ b/src/modules/base/static/svg/back.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/close-border.svg b/src/modules/base/static/svg/close-border.svg new file mode 100644 index 0000000..4c125fa --- /dev/null +++ b/src/modules/base/static/svg/close-border.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/close.svg b/src/modules/base/static/svg/close.svg new file mode 100644 index 0000000..b45fab1 --- /dev/null +++ b/src/modules/base/static/svg/close.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/src/modules/base/static/svg/delete.svg b/src/modules/base/static/svg/delete.svg new file mode 100644 index 0000000..fccd1e8 --- /dev/null +++ b/src/modules/base/static/svg/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/edit.svg b/src/modules/base/static/svg/edit.svg new file mode 100644 index 0000000..e1de5c5 --- /dev/null +++ b/src/modules/base/static/svg/edit.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/src/modules/base/static/svg/exit.svg b/src/modules/base/static/svg/exit.svg new file mode 100644 index 0000000..f6071c5 --- /dev/null +++ b/src/modules/base/static/svg/exit.svg @@ -0,0 +1,25 @@ + + + + + + diff --git a/src/modules/base/static/svg/expand.svg b/src/modules/base/static/svg/expand.svg new file mode 100644 index 0000000..453a7b3 --- /dev/null +++ b/src/modules/base/static/svg/expand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/export.svg b/src/modules/base/static/svg/export.svg new file mode 100644 index 0000000..65c8e16 --- /dev/null +++ b/src/modules/base/static/svg/export.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/fail.svg b/src/modules/base/static/svg/fail.svg new file mode 100644 index 0000000..545abc6 --- /dev/null +++ b/src/modules/base/static/svg/fail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/fold.svg b/src/modules/base/static/svg/fold.svg new file mode 100644 index 0000000..feb1d41 --- /dev/null +++ b/src/modules/base/static/svg/fold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/github.svg b/src/modules/base/static/svg/github.svg new file mode 100644 index 0000000..a2663ad --- /dev/null +++ b/src/modules/base/static/svg/github.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/home.svg b/src/modules/base/static/svg/home.svg new file mode 100644 index 0000000..d6f732d --- /dev/null +++ b/src/modules/base/static/svg/home.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/icon-activity.svg b/src/modules/base/static/svg/icon-activity.svg new file mode 100644 index 0000000..be00ee9 --- /dev/null +++ b/src/modules/base/static/svg/icon-activity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-amount.svg b/src/modules/base/static/svg/icon-amount.svg new file mode 100644 index 0000000..13c68d9 --- /dev/null +++ b/src/modules/base/static/svg/icon-amount.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-app.svg b/src/modules/base/static/svg/icon-app.svg new file mode 100644 index 0000000..1d82a1c --- /dev/null +++ b/src/modules/base/static/svg/icon-app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-approve.svg b/src/modules/base/static/svg/icon-approve.svg new file mode 100644 index 0000000..e77593c --- /dev/null +++ b/src/modules/base/static/svg/icon-approve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-auth.svg b/src/modules/base/static/svg/icon-auth.svg new file mode 100644 index 0000000..b299f59 --- /dev/null +++ b/src/modules/base/static/svg/icon-auth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-ban.svg b/src/modules/base/static/svg/icon-ban.svg new file mode 100644 index 0000000..0376a77 --- /dev/null +++ b/src/modules/base/static/svg/icon-ban.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-call.svg b/src/modules/base/static/svg/icon-call.svg new file mode 100644 index 0000000..d35cabc --- /dev/null +++ b/src/modules/base/static/svg/icon-call.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-camera.svg b/src/modules/base/static/svg/icon-camera.svg new file mode 100644 index 0000000..97dff8f --- /dev/null +++ b/src/modules/base/static/svg/icon-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-card.svg b/src/modules/base/static/svg/icon-card.svg new file mode 100644 index 0000000..f6ae0e8 --- /dev/null +++ b/src/modules/base/static/svg/icon-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-cart.svg b/src/modules/base/static/svg/icon-cart.svg new file mode 100644 index 0000000..f6833eb --- /dev/null +++ b/src/modules/base/static/svg/icon-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-common.svg b/src/modules/base/static/svg/icon-common.svg new file mode 100644 index 0000000..7fe6060 --- /dev/null +++ b/src/modules/base/static/svg/icon-common.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-component.svg b/src/modules/base/static/svg/icon-component.svg new file mode 100644 index 0000000..a44dae7 --- /dev/null +++ b/src/modules/base/static/svg/icon-component.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/icon-count.svg b/src/modules/base/static/svg/icon-count.svg new file mode 100644 index 0000000..daf26ba --- /dev/null +++ b/src/modules/base/static/svg/icon-count.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-crown.svg b/src/modules/base/static/svg/icon-crown.svg new file mode 100644 index 0000000..71429de --- /dev/null +++ b/src/modules/base/static/svg/icon-crown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-data.svg b/src/modules/base/static/svg/icon-data.svg new file mode 100644 index 0000000..1dbfe70 --- /dev/null +++ b/src/modules/base/static/svg/icon-data.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-db.svg b/src/modules/base/static/svg/icon-db.svg new file mode 100644 index 0000000..4a5d345 --- /dev/null +++ b/src/modules/base/static/svg/icon-db.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-delete.svg b/src/modules/base/static/svg/icon-delete.svg new file mode 100644 index 0000000..610d33e --- /dev/null +++ b/src/modules/base/static/svg/icon-delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-dept.svg b/src/modules/base/static/svg/icon-dept.svg new file mode 100644 index 0000000..f0af65d --- /dev/null +++ b/src/modules/base/static/svg/icon-dept.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-design.svg b/src/modules/base/static/svg/icon-design.svg new file mode 100644 index 0000000..3aed42f --- /dev/null +++ b/src/modules/base/static/svg/icon-design.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-device.svg b/src/modules/base/static/svg/icon-device.svg new file mode 100644 index 0000000..f82b640 --- /dev/null +++ b/src/modules/base/static/svg/icon-device.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-dict.svg b/src/modules/base/static/svg/icon-dict.svg new file mode 100644 index 0000000..444ceee --- /dev/null +++ b/src/modules/base/static/svg/icon-dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-discover.svg b/src/modules/base/static/svg/icon-discover.svg new file mode 100644 index 0000000..3747d7e --- /dev/null +++ b/src/modules/base/static/svg/icon-discover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-doc.svg b/src/modules/base/static/svg/icon-doc.svg new file mode 100644 index 0000000..d82fa34 --- /dev/null +++ b/src/modules/base/static/svg/icon-doc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-download.svg b/src/modules/base/static/svg/icon-download.svg new file mode 100644 index 0000000..b86f044 --- /dev/null +++ b/src/modules/base/static/svg/icon-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-emoji.svg b/src/modules/base/static/svg/icon-emoji.svg new file mode 100644 index 0000000..2809858 --- /dev/null +++ b/src/modules/base/static/svg/icon-emoji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-favor.svg b/src/modules/base/static/svg/icon-favor.svg new file mode 100644 index 0000000..98ad58e --- /dev/null +++ b/src/modules/base/static/svg/icon-favor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-file.svg b/src/modules/base/static/svg/icon-file.svg new file mode 100644 index 0000000..5ab59d6 --- /dev/null +++ b/src/modules/base/static/svg/icon-file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-folder.svg b/src/modules/base/static/svg/icon-folder.svg new file mode 100644 index 0000000..7ad8ab7 --- /dev/null +++ b/src/modules/base/static/svg/icon-folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-goods.svg b/src/modules/base/static/svg/icon-goods.svg new file mode 100644 index 0000000..391d0ea --- /dev/null +++ b/src/modules/base/static/svg/icon-goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-home.svg b/src/modules/base/static/svg/icon-home.svg new file mode 100644 index 0000000..94cf445 --- /dev/null +++ b/src/modules/base/static/svg/icon-home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-hot.svg b/src/modules/base/static/svg/icon-hot.svg new file mode 100644 index 0000000..b907eeb --- /dev/null +++ b/src/modules/base/static/svg/icon-hot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-info.svg b/src/modules/base/static/svg/icon-info.svg new file mode 100644 index 0000000..4805c9a --- /dev/null +++ b/src/modules/base/static/svg/icon-info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-iot.svg b/src/modules/base/static/svg/icon-iot.svg new file mode 100644 index 0000000..f7ccae0 --- /dev/null +++ b/src/modules/base/static/svg/icon-iot.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-light.svg b/src/modules/base/static/svg/icon-light.svg new file mode 100644 index 0000000..b07a126 --- /dev/null +++ b/src/modules/base/static/svg/icon-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-like.svg b/src/modules/base/static/svg/icon-like.svg new file mode 100644 index 0000000..c49af81 --- /dev/null +++ b/src/modules/base/static/svg/icon-like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-list.svg b/src/modules/base/static/svg/icon-list.svg new file mode 100644 index 0000000..a53f8ba --- /dev/null +++ b/src/modules/base/static/svg/icon-list.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-local.svg b/src/modules/base/static/svg/icon-local.svg new file mode 100644 index 0000000..6bedcdf --- /dev/null +++ b/src/modules/base/static/svg/icon-local.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-log.svg b/src/modules/base/static/svg/icon-log.svg new file mode 100644 index 0000000..e35c47b --- /dev/null +++ b/src/modules/base/static/svg/icon-log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-map.svg b/src/modules/base/static/svg/icon-map.svg new file mode 100644 index 0000000..9befbd4 --- /dev/null +++ b/src/modules/base/static/svg/icon-map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-match.svg b/src/modules/base/static/svg/icon-match.svg new file mode 100644 index 0000000..f7c68ef --- /dev/null +++ b/src/modules/base/static/svg/icon-match.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-menu.svg b/src/modules/base/static/svg/icon-menu.svg new file mode 100644 index 0000000..b58dbf9 --- /dev/null +++ b/src/modules/base/static/svg/icon-menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-monitor.svg b/src/modules/base/static/svg/icon-monitor.svg new file mode 100644 index 0000000..5fa7b77 --- /dev/null +++ b/src/modules/base/static/svg/icon-monitor.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-msg.svg b/src/modules/base/static/svg/icon-msg.svg new file mode 100644 index 0000000..54c0992 --- /dev/null +++ b/src/modules/base/static/svg/icon-msg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-news.svg b/src/modules/base/static/svg/icon-news.svg new file mode 100644 index 0000000..5cec609 --- /dev/null +++ b/src/modules/base/static/svg/icon-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-notice.svg b/src/modules/base/static/svg/icon-notice.svg new file mode 100644 index 0000000..5c8048d --- /dev/null +++ b/src/modules/base/static/svg/icon-notice.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-params.svg b/src/modules/base/static/svg/icon-params.svg new file mode 100644 index 0000000..9683e72 --- /dev/null +++ b/src/modules/base/static/svg/icon-params.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-phone.svg b/src/modules/base/static/svg/icon-phone.svg new file mode 100644 index 0000000..8910aab --- /dev/null +++ b/src/modules/base/static/svg/icon-phone.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-pic.svg b/src/modules/base/static/svg/icon-pic.svg new file mode 100644 index 0000000..02265cd --- /dev/null +++ b/src/modules/base/static/svg/icon-pic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-question.svg b/src/modules/base/static/svg/icon-question.svg new file mode 100644 index 0000000..1731198 --- /dev/null +++ b/src/modules/base/static/svg/icon-question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-quick.svg b/src/modules/base/static/svg/icon-quick.svg new file mode 100644 index 0000000..61bdb79 --- /dev/null +++ b/src/modules/base/static/svg/icon-quick.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-rank.svg b/src/modules/base/static/svg/icon-rank.svg new file mode 100644 index 0000000..60916c5 --- /dev/null +++ b/src/modules/base/static/svg/icon-rank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-reward.svg b/src/modules/base/static/svg/icon-reward.svg new file mode 100644 index 0000000..f01f848 --- /dev/null +++ b/src/modules/base/static/svg/icon-reward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-search.svg b/src/modules/base/static/svg/icon-search.svg new file mode 100644 index 0000000..166aebf --- /dev/null +++ b/src/modules/base/static/svg/icon-search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-set.svg b/src/modules/base/static/svg/icon-set.svg new file mode 100644 index 0000000..fb53057 --- /dev/null +++ b/src/modules/base/static/svg/icon-set.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-tag.svg b/src/modules/base/static/svg/icon-tag.svg new file mode 100644 index 0000000..84adbce --- /dev/null +++ b/src/modules/base/static/svg/icon-tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-task.svg b/src/modules/base/static/svg/icon-task.svg new file mode 100644 index 0000000..470280f --- /dev/null +++ b/src/modules/base/static/svg/icon-task.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-time.svg b/src/modules/base/static/svg/icon-time.svg new file mode 100644 index 0000000..7ac6296 --- /dev/null +++ b/src/modules/base/static/svg/icon-time.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-tutorial.svg b/src/modules/base/static/svg/icon-tutorial.svg new file mode 100644 index 0000000..cc2323e --- /dev/null +++ b/src/modules/base/static/svg/icon-tutorial.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-unlock.svg b/src/modules/base/static/svg/icon-unlock.svg new file mode 100644 index 0000000..78b6413 --- /dev/null +++ b/src/modules/base/static/svg/icon-unlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-user.svg b/src/modules/base/static/svg/icon-user.svg new file mode 100644 index 0000000..66d8df7 --- /dev/null +++ b/src/modules/base/static/svg/icon-user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-video.svg b/src/modules/base/static/svg/icon-video.svg new file mode 100644 index 0000000..1eee5b9 --- /dev/null +++ b/src/modules/base/static/svg/icon-video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-vip.svg b/src/modules/base/static/svg/icon-vip.svg new file mode 100644 index 0000000..31f4f67 --- /dev/null +++ b/src/modules/base/static/svg/icon-vip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-warn.svg b/src/modules/base/static/svg/icon-warn.svg new file mode 100644 index 0000000..3eab18d --- /dev/null +++ b/src/modules/base/static/svg/icon-warn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-work.svg b/src/modules/base/static/svg/icon-work.svg new file mode 100644 index 0000000..bea8473 --- /dev/null +++ b/src/modules/base/static/svg/icon-work.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/icon-workbench.svg b/src/modules/base/static/svg/icon-workbench.svg new file mode 100644 index 0000000..ff959d3 --- /dev/null +++ b/src/modules/base/static/svg/icon-workbench.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/image.svg b/src/modules/base/static/svg/image.svg new file mode 100644 index 0000000..fca2c66 --- /dev/null +++ b/src/modules/base/static/svg/image.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/import.svg b/src/modules/base/static/svg/import.svg new file mode 100644 index 0000000..ae272f2 --- /dev/null +++ b/src/modules/base/static/svg/import.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/left.svg b/src/modules/base/static/svg/left.svg new file mode 100644 index 0000000..f49a79b --- /dev/null +++ b/src/modules/base/static/svg/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/my.svg b/src/modules/base/static/svg/my.svg new file mode 100644 index 0000000..a422ae4 --- /dev/null +++ b/src/modules/base/static/svg/my.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/src/modules/base/static/svg/order.svg b/src/modules/base/static/svg/order.svg new file mode 100644 index 0000000..1dbbc68 --- /dev/null +++ b/src/modules/base/static/svg/order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/play.svg b/src/modules/base/static/svg/play.svg new file mode 100644 index 0000000..e5b5f40 --- /dev/null +++ b/src/modules/base/static/svg/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/plus-border.svg b/src/modules/base/static/svg/plus-border.svg new file mode 100644 index 0000000..a36cf9d --- /dev/null +++ b/src/modules/base/static/svg/plus-border.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/plus.svg b/src/modules/base/static/svg/plus.svg new file mode 100644 index 0000000..4207733 --- /dev/null +++ b/src/modules/base/static/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/refresh.svg b/src/modules/base/static/svg/refresh.svg new file mode 100644 index 0000000..a9f1281 --- /dev/null +++ b/src/modules/base/static/svg/refresh.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/src/modules/base/static/svg/right.svg b/src/modules/base/static/svg/right.svg new file mode 100644 index 0000000..d488008 --- /dev/null +++ b/src/modules/base/static/svg/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/screen-full.svg b/src/modules/base/static/svg/screen-full.svg new file mode 100644 index 0000000..a0e4c57 --- /dev/null +++ b/src/modules/base/static/svg/screen-full.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/screen-normal.svg b/src/modules/base/static/svg/screen-normal.svg new file mode 100644 index 0000000..c5d80d5 --- /dev/null +++ b/src/modules/base/static/svg/screen-normal.svg @@ -0,0 +1,17 @@ + + + + diff --git a/src/modules/base/static/svg/search.svg b/src/modules/base/static/svg/search.svg new file mode 100644 index 0000000..54e1135 --- /dev/null +++ b/src/modules/base/static/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/set.svg b/src/modules/base/static/svg/set.svg new file mode 100644 index 0000000..aa84b0a --- /dev/null +++ b/src/modules/base/static/svg/set.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/sort.svg b/src/modules/base/static/svg/sort.svg new file mode 100644 index 0000000..f842b4b --- /dev/null +++ b/src/modules/base/static/svg/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/stats.svg b/src/modules/base/static/svg/stats.svg new file mode 100644 index 0000000..25eec42 --- /dev/null +++ b/src/modules/base/static/svg/stats.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/success.svg b/src/modules/base/static/svg/success.svg new file mode 100644 index 0000000..66d15fd --- /dev/null +++ b/src/modules/base/static/svg/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/team.svg b/src/modules/base/static/svg/team.svg new file mode 100644 index 0000000..32acf07 --- /dev/null +++ b/src/modules/base/static/svg/team.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/static/svg/trend.svg b/src/modules/base/static/svg/trend.svg new file mode 100644 index 0000000..aa8215b --- /dev/null +++ b/src/modules/base/static/svg/trend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/base/store/app.ts b/src/modules/base/store/app.ts new file mode 100644 index 0000000..0a0bd57 --- /dev/null +++ b/src/modules/base/store/app.ts @@ -0,0 +1,69 @@ +import { defineStore } from 'pinia'; +import { reactive, ref } from 'vue'; +import { merge } from 'lodash-es'; +import { useBrowser } from '/@/cool'; +import { storage } from '/@/cool/utils'; +import { config } from '/@/config'; + +export const useAppStore = defineStore('app', function () { + const { browser, onScreenChange } = useBrowser(); + + // 基本信息 + const info = reactive({ + ...config.app + }); + + // 设置基本信息 + function set(data: any) { + merge(info, data); + storage.set('__app__', info); + } + + // 是否折叠 + const isFold = ref(false); + + // 折叠 + function fold(v?: boolean) { + if (v === undefined) { + v = !isFold.value; + } + + isFold.value = v; + } + + // 是否全屏 + const isFull = ref(false); + + // 设置全屏 + function setFull(state: boolean) { + isFull.value = state; + } + + // 事件 + const events = reactive<{ [key: string]: any[] }>({ + hasToken: [] + }); + + // 添加事件 + function addEvent(name: string, func: any) { + if (func) { + events[name].push(func); + } + } + + // 监听屏幕变化 + onScreenChange(() => { + isFold.value = browser.isMini; + }); + + return { + info, + isFold, + fold, + isFull, + setFull, + events, + set, + addEvent + }; +}); diff --git a/src/modules/base/store/index.ts b/src/modules/base/store/index.ts new file mode 100644 index 0000000..1aa03f8 --- /dev/null +++ b/src/modules/base/store/index.ts @@ -0,0 +1,18 @@ +import { useAppStore } from './app'; +import { useMenuStore } from './menu'; +import { useProcessStore } from './process'; +import { useUserStore } from './user'; + +export function useStore() { + const app = useAppStore(); + const menu = useMenuStore(); + const process = useProcessStore(); + const user = useUserStore(); + + return { + app, + menu, + process, + user + }; +} diff --git a/src/modules/base/store/menu.ts b/src/modules/base/store/menu.ts new file mode 100644 index 0000000..5dfbc1d --- /dev/null +++ b/src/modules/base/store/menu.ts @@ -0,0 +1,205 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { deepTree, revDeepTree, storage } from '/@/cool/utils'; +import { isArray, isEmpty, orderBy } from 'lodash-es'; +import { router, service } from '/@/cool'; +import { revisePath } from '../utils'; +import { config } from '/@/config'; + +// 本地缓存 +const data = storage.info(); + +export const useMenuStore = defineStore('menu', function () { + // 所有菜单 + const all = ref([]); + + // 视图路由 + const routes = ref([]); + + // 菜单组 + const group = ref(data['base.menuGroup'] || []); + + // 左侧菜单列表 + const list = ref([]); + + // 权限列表 + const perms = ref(data['base.menuPerms'] || []); + + // 设置左侧菜单 + function setMenu(i: number = 0) { + // 显示分组显示菜单 + if (config.app.menu.isGroup) { + list.value = group.value.filter(e => e.isShow)[i]?.children || []; + } else { + list.value = group.value; + } + } + + // 设置权限 + function setPerms(list: Menu.List) { + function deep(d: any) { + if (typeof d == 'object') { + if (d.permission) { + if (d.namespace) { + d._permission = {}; + for (const i in d.permission) { + d._permission[i] = + list.findIndex(e => + e + .replace(/:/g, '/') + .includes(`${d.namespace.replace('admin/', '')}/${i}`) + ) >= 0; + } + } else { + console.error('namespace is required', d); + } + } else { + for (const i in d) { + deep(d[i]); + } + } + } + } + + perms.value = list; + storage.set('base.menuPerms', list); + + deep(service); + } + + // 设置视图 + function setRoutes(list: Menu.List) { + // 获取第一个菜单路径 + const fp = getPath(group.value); + + // 查找符合路由 + const route = list.find(e => (e.meta!.isHome = e.path == fp)); + + // 过滤菜单 + routes.value = list.filter(e => e.type == 1); + + if (route) { + // 移除旧路由 + router.del('home'); + router.del('homeRedirect'); + + // 添加一个重定向 + if (route.path != '/') { + const item = routes.value.find(e => e.name == 'homeRedirect'); + + if (item) { + item.path = route.path; + } else { + routes.value.push({ + path: route.path, + redirect: '/', + name: 'homeRedirect' + } as any); + } + } + + // 设置为首页 + route.path = '/'; + route.name = 'home'; + } + } + + // 设置菜单组 + function setGroup(list: Menu.List) { + group.value = orderBy(deepTree(list), 'orderNum'); + storage.set('base.menuGroup', group.value); + } + + // 获取菜单,权限信息 + async function get() { + function next(res: { menus: Menu.List; perms?: any[] }) { + // 所有菜单 + all.value = res.menus; + + // 菜单格式化 + const list = res.menus + ?.filter(e => e.type != 2) + .map(e => { + const path = revisePath(e.router || String(e.id)); + const isShow = e.isShow === undefined ? true : e.isShow; + + return { + ...e, + path, + isShow, + meta: { + ...e.meta, + label: e.name, // 菜单名称的唯一标识 + keepAlive: e.keepAlive || 0 + }, + name: `${e.name}-${e.id}`, // 避免重复命名之前的冲突 + children: [] + }; + }); + + // 设置权限 + setPerms(res.perms || []); + + // 设置菜单组 + setGroup(list); + + // 设置视图路由 + setRoutes(list); + + // 设置菜单 + setMenu(); + + return list; + } + + // 自定义菜单 + if (!isEmpty(config.app.menu.list)) { + next({ + menus: revDeepTree(config.app.menu.list || []) + }); + } else { + // 动态菜单 + await service.base.comm.permmenu().then(next); + } + } + + // 获取菜单路径 + function getPath(data: Menu.Item | Menu.List) { + const list = isArray(data) ? data : [data]; + + let path = ''; + + function deep(arr: Menu.List) { + arr.forEach((e: Menu.Item) => { + switch (e.type) { + case 0: + deep(e.children || []); + break; + case 1: + if (!path) { + path = e.path; + } + break; + } + }); + } + + deep(list); + + return path; + } + + return { + all, + routes, + group, + list, + perms, + get, + setPerms, + setMenu, + setRoutes, + setGroup, + getPath + }; +}); diff --git a/src/modules/base/store/process.ts b/src/modules/base/store/process.ts new file mode 100644 index 0000000..076a1c0 --- /dev/null +++ b/src/modules/base/store/process.ts @@ -0,0 +1,74 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { assign } from 'lodash-es'; + +export const useProcessStore = defineStore('process', function () { + const list = ref([]); + + // 添加 + function add(data: any) { + list.value.forEach((e: Process.Item) => { + e.active = false; + }); + + if (!data.meta) { + data.meta = {}; + } + + if (!data.meta?.isHome && data.meta?.process !== false) { + const index = list.value.findIndex(e => e.path === data.path); + + if (index < 0) { + list.value.push({ + ...data, + active: true + }); + } else { + assign(list.value[index], data, { active: true }); + } + } + } + + // 关闭当前 + function close() { + const index = list.value.findIndex(e => e.active); + + if (index > -1) { + list.value.splice(index, 1); + } + } + + // 移除 + function remove(index: number) { + list.value.splice(index, 1); + } + + // 设置 + function set(data: Process.Item[]) { + list.value = data; + } + + // 清空 + function clear() { + list.value = []; + } + + // 设置标题 + function setTitle(title: string) { + const item = list.value.find(e => e.active); + + if (item) { + item.meta.label = title; + } + } + + return { + list, + add, + remove, + close, + set, + clear, + setTitle + }; +}); diff --git a/src/modules/base/store/user.ts b/src/modules/base/store/user.ts new file mode 100644 index 0000000..071a2cf --- /dev/null +++ b/src/modules/base/store/user.ts @@ -0,0 +1,88 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { storage } from '/@/cool/utils'; +import { service, router } from '/@/cool'; + +// 本地缓存 +const data = storage.info(); + +export const useUserStore = defineStore('user', function () { + // 标识 + const token = ref(data.token); + + // 设置标识 + function setToken(data: { + token: string; + expire: number; + refreshToken: string; + refreshExpire: number; + }) { + // 请求的唯一标识 + token.value = data.token; + storage.set('token', data.token, data.expire); + + // 刷新 token 的唯一标识 + storage.set('refreshToken', data.refreshToken, data.refreshExpire); + } + + // 刷新标识 + async function refreshToken(): Promise { + return new Promise((resolve, reject) => { + service.base.open + .refreshToken({ + refreshToken: storage.get('refreshToken') + }) + .then(res => { + setToken(res); + resolve(res.token); + }) + .catch(err => { + logout(); + reject(err); + }); + }); + } + + // 用户信息 + const info = ref(data.userInfo); + + // 设置用户信息 + function set(value: any) { + info.value = value; + storage.set('userInfo', value); + } + + // 清除用户 + function clear() { + storage.remove('userInfo'); + storage.remove('token'); + token.value = ''; + info.value = null; + } + + // 退出 + async function logout() { + clear(); + router.clear(); + router.push('/login'); + } + + // 获取用户信息 + async function get() { + return service.base.comm.person().then(res => { + set(res); + return res; + }); + } + + return { + token, + info, + get, + set, + logout, + clear, + setToken, + refreshToken + }; +}); diff --git a/src/modules/base/types/index.d.ts b/src/modules/base/types/index.d.ts new file mode 100644 index 0000000..81675fe --- /dev/null +++ b/src/modules/base/types/index.d.ts @@ -0,0 +1,52 @@ +declare namespace Menu { + enum Type { + '目录' = 0, + '菜单' = 1, + '权限' = 2 + } + + interface Item { + id: number; + parentId: number; + path: string; + router?: string; + viewPath?: string; + type: Type; + name: string; + icon: string; + badge?: number; + badgeColor?: 'primary' | 'success' | 'warning' | 'danger' | 'info'; + orderNum: number; + isShow: number | boolean; + keepAlive?: number; + meta?: { + label?: string; + keepAlive?: number | boolean; + iframeUrl?: string; + isHome?: boolean; + [key: string]: any; + }; + children?: Item[]; + component?: any; + redirect?: string; + [key: string]: any; + } + + type List = Item[]; +} + +declare namespace Process { + interface Item { + active: boolean; + name: string; + path: string; + fullPath: string; + meta: { + label: string; + [key: string]: any; + }; + [key: string]: any; + } + + type List = Item[]; +} diff --git a/src/modules/base/utils/index.ts b/src/modules/base/utils/index.ts new file mode 100644 index 0000000..fa24a0b --- /dev/null +++ b/src/modules/base/utils/index.ts @@ -0,0 +1,9 @@ +export function revisePath(path: string) { + if (!path) { + return ''; + } + + return path.startsWith('/') ? path : `/${path}`; +} + +export * from './permission'; diff --git a/src/modules/base/utils/permission.ts b/src/modules/base/utils/permission.ts new file mode 100644 index 0000000..efa9f60 --- /dev/null +++ b/src/modules/base/utils/permission.ts @@ -0,0 +1,30 @@ +import { useStore } from '../store'; +import { isObject } from 'lodash-es'; + +function parse(value: any) { + const { menu } = useStore(); + + if (typeof value == 'string') { + return value ? menu.perms.some((e: any) => e.includes(value.replace(/\s/g, ''))) : false; + } else { + return Boolean(value); + } +} + +export function checkPerm(value: string | { or?: string[]; and?: string[] }) { + if (!value) { + return false; + } + + if (isObject(value)) { + if (value.or) { + return value.or.some(parse); + } + + if (value.and) { + return value.and.some((e: any) => !parse(e)) ? false : true; + } + } + + return parse(value); +} diff --git a/src/modules/base/views/frame.vue b/src/modules/base/views/frame.vue new file mode 100644 index 0000000..4c0a491 --- /dev/null +++ b/src/modules/base/views/frame.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/modules/base/views/info.vue b/src/modules/base/views/info.vue new file mode 100644 index 0000000..8c836e7 --- /dev/null +++ b/src/modules/base/views/info.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/modules/base/views/log.vue b/src/modules/base/views/log.vue new file mode 100644 index 0000000..3204876 --- /dev/null +++ b/src/modules/base/views/log.vue @@ -0,0 +1,153 @@ + + + diff --git a/src/modules/base/views/menu/components/exp.vue b/src/modules/base/views/menu/components/exp.vue new file mode 100644 index 0000000..eb85384 --- /dev/null +++ b/src/modules/base/views/menu/components/exp.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/modules/base/views/menu/components/imp.vue b/src/modules/base/views/menu/components/imp.vue new file mode 100644 index 0000000..73faf95 --- /dev/null +++ b/src/modules/base/views/menu/components/imp.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/modules/base/views/menu/index.vue b/src/modules/base/views/menu/index.vue new file mode 100644 index 0000000..597a004 --- /dev/null +++ b/src/modules/base/views/menu/index.vue @@ -0,0 +1,404 @@ + + + diff --git a/src/modules/base/views/param.vue b/src/modules/base/views/param.vue new file mode 100644 index 0000000..c7ef57e --- /dev/null +++ b/src/modules/base/views/param.vue @@ -0,0 +1,226 @@ + + + diff --git a/src/modules/base/views/role.vue b/src/modules/base/views/role.vue new file mode 100644 index 0000000..8dadea2 --- /dev/null +++ b/src/modules/base/views/role.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/modules/base/views/user/components/dept-list.vue b/src/modules/base/views/user/components/dept-list.vue new file mode 100644 index 0000000..19d5519 --- /dev/null +++ b/src/modules/base/views/user/components/dept-list.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/src/modules/base/views/user/components/user-move.vue b/src/modules/base/views/user/components/user-move.vue new file mode 100644 index 0000000..8d51495 --- /dev/null +++ b/src/modules/base/views/user/components/user-move.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/modules/base/views/user/index.vue b/src/modules/base/views/user/index.vue new file mode 100644 index 0000000..bcd761c --- /dev/null +++ b/src/modules/base/views/user/index.vue @@ -0,0 +1,342 @@ + + + diff --git a/src/modules/cs/components/index.vue b/src/modules/cs/components/index.vue new file mode 100644 index 0000000..3e4f255 --- /dev/null +++ b/src/modules/cs/components/index.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/src/modules/cs/components/message.vue b/src/modules/cs/components/message.vue new file mode 100644 index 0000000..2af1d6a --- /dev/null +++ b/src/modules/cs/components/message.vue @@ -0,0 +1,526 @@ + + + + + diff --git a/src/modules/cs/components/session.vue b/src/modules/cs/components/session.vue new file mode 100644 index 0000000..b983125 --- /dev/null +++ b/src/modules/cs/components/session.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/src/modules/cs/components/tools/emoji.vue b/src/modules/cs/components/tools/emoji.vue new file mode 100644 index 0000000..8f46380 --- /dev/null +++ b/src/modules/cs/components/tools/emoji.vue @@ -0,0 +1,162 @@ + + + + + + + diff --git a/src/modules/cs/config.ts b/src/modules/cs/config.ts new file mode 100644 index 0000000..4245f85 --- /dev/null +++ b/src/modules/cs/config.ts @@ -0,0 +1,10 @@ +import type { ModuleConfig } from '/@/cool'; + +export default (): ModuleConfig => { + return { + toolbar: { + order: 2, + component: import('./components/index.vue') + } + }; +}; diff --git a/src/modules/cs/hooks/index.ts b/src/modules/cs/hooks/index.ts new file mode 100644 index 0000000..df17a57 --- /dev/null +++ b/src/modules/cs/hooks/index.ts @@ -0,0 +1,5 @@ +export * from "./socket"; +export * from "./session"; +export * from "./message"; +export * from "./tools"; +export * from "./notice"; diff --git a/src/modules/cs/hooks/message.ts b/src/modules/cs/hooks/message.ts new file mode 100644 index 0000000..c05b532 --- /dev/null +++ b/src/modules/cs/hooks/message.ts @@ -0,0 +1,128 @@ +import { defineStore } from "pinia"; +import { computed, ref } from "vue"; +import type { Cs } from "../types"; +import dayjs from "dayjs"; +import { service } from "/@/cool"; +import { isEmpty, last } from "lodash-es"; +import { useSession } from "./session"; +import { uuid } from "/@/cool/utils"; +import { useTools } from "./tools"; +import { dateFormatter } from "../utils"; +import { useBase } from "/$/base"; + +export const useMessage = defineStore("cs.message", () => { + const session = useSession(); + const tools = useTools(); + const { user } = useBase(); + + // 加载中 + const loading = ref(false); + + // 未读消息数 + const unread = ref(0); + + // 所有页 + const data = ref<{ id: string; data: Cs.Msg[] }[]>([]); + + // 列表 + const list = computed(() => { + data.value.forEach((e) => { + if (e.data[0]) { + let date = e.data[0].createTime; + + if (date) { + e.data.forEach((a, i) => { + const d = dateFormatter(a.createTime); + + if (i == 0) { + a.date = d; + } + + if (dayjs(a.createTime).subtract(10, "minute").isAfter(dayjs(date))) { + a.date = d; + date = a.createTime; + } + }); + } + } + }); + + return data.value; + }); + + // 追加消息 + function append(item: Cs.Msg) { + const list = last(data.value)?.data; + + if (list) { + list.push({ + sessionId: session.info?.id, + type: 1, + nickName: user.info?.name, + avatarUrl: user.info?.headImg, + ...item + }); + + tools.scrollToBottom(); + } + } + + // 获取消息 + async function refresh(params?: any) { + loading.value = true; + + if (params.page == 1) { + data.value = []; + } + + await service.cs.msg + .page({ + sessionId: session.info?.id, + order: "createTime", + sort: "desc", + ...params + }) + .then((res) => { + if (!isEmpty(res.list)) { + res.list.forEach((e) => { + if (e.type == 1) { + e.avatarUrl = e.adminUserHeadImg; + e.nickName = e.adminUserName; + } + }); + + data.value.unshift({ + id: uuid(), + data: res.list.reverse() as any[] + }); + } + }); + + loading.value = false; + } + + // 获取未读消息 + function getUnread() { + service.cs.msg.unreadCount().then((res) => { + unread.value = res; + }); + } + + // 读消息 + function read(id: number) { + service.cs.msg.read({ + msgIds: [id] + }); + } + + return { + data, + list, + loading, + unread, + append, + refresh, + read, + getUnread + }; +}); diff --git a/src/modules/cs/hooks/notice.tsx b/src/modules/cs/hooks/notice.tsx new file mode 100644 index 0000000..8b9690d --- /dev/null +++ b/src/modules/cs/hooks/notice.tsx @@ -0,0 +1,68 @@ +import Ding from "/$/cs/static/audio/ding.wav"; +import type { Cs } from "../types"; +import { ElNotification } from "element-plus"; +import { getEmoji } from "../utils"; +import { useSession } from "./session"; + +export function useNotice() { + const session = useSession(); + + // ding + const audio = new Audio(Ding); + + // 消息提示 + function create({ content, user, sessionId }: Cs.Msg, { open }: { open: () => Promise }) { + if (content) { + const icon = ; + + let message = content.data; + + switch (content.type) { + case "image": + message = "[图片]"; + break; + + case "voice": + message = "[语音]"; + break; + + case "video": + message = "[视频]"; + break; + + case "file": + message = "[文件]"; + break; + + case "location": + message = "[位置]"; + break; + + case "emoji": + message = ( + + ); + break; + } + + ElNotification({ + title: user.nickName, + message, + icon, + async onClick() { + await open(); + + // 切换会话 + session.setById(sessionId!); + } + }); + } + + // 播放声音 + audio?.play(); + } + + return { + create + }; +} diff --git a/src/modules/cs/hooks/session.ts b/src/modules/cs/hooks/session.ts new file mode 100644 index 0000000..26b1c33 --- /dev/null +++ b/src/modules/cs/hooks/session.ts @@ -0,0 +1,97 @@ +import { defineStore } from "pinia"; +import { reactive, ref } from "vue"; +import { Cs } from "../types"; +import { service } from "/@/cool"; + +export const useSession = defineStore("cs.session", () => { + // 详情 + const info = ref(); + + // 列表 + const list = ref([]); + + // 是否加载完 + const loaded = ref(false); + + // 加载状态 + const loading = ref(false); + + // 分页 + const pagination = reactive({ + page: 1, + size: 20 + }); + + // 请求参数 + const reqParams = { + order: "updateTime", + sort: "desc" + }; + + // 刷新 + async function refresh(params?: any) { + loading.value = true; + + // 合并参数 + Object.assign(reqParams, params); + + // 请求 + await service.cs.session + .page({ + ...pagination, + ...reqParams + }) + .then((res) => { + // 设置分页 + Object.assign(pagination, res.pagination); + + if (res.pagination.page == 1) { + list.value = res.list; + } else { + list.value.push(...res.list); + } + + // 是否加载完成 + loaded.value = res.pagination.total <= list.value.length; + + // 默认第一个 + if (!info.value) { + set(list.value[0]); + } + }); + + loading.value = false; + } + + // 设置会话 + function set(data?: Cs.Session) { + if (data) { + data.adminUnreadCount = 0; + } + + info.value = data; + } + + // 通过id设置会话 + function setById(sessionId: number) { + const item = list.value.find((e) => e.id == sessionId); + set(item); + } + + // 清空会话 + function clear() { + info.value = undefined; + } + + return { + info, + list, + set, + setById, + clear, + pagination, + loaded, + loading, + refresh + }; +}); diff --git a/src/modules/cs/hooks/socket.ts b/src/modules/cs/hooks/socket.ts new file mode 100644 index 0000000..dce47a9 --- /dev/null +++ b/src/modules/cs/hooks/socket.ts @@ -0,0 +1,95 @@ +import type { Cs } from "../types"; +import { defineStore } from "pinia"; +import io, { type Socket } from "socket.io-client"; +import { useSession } from "./session"; +import { useBase } from "/$/base"; +import { config } from "/@/config"; +import { useMessage } from "./message"; +import { useCool } from "/@/cool"; + +export const useSocket = defineStore("cs.socket", () => { + const { mitt } = useCool(); + const { user } = useBase(); + const session = useSession(); + const message = useMessage(); + + let client = undefined as Socket | undefined; + + function connect() { + if (!user.token) { + return false; + } + + if (client) { + client.disconnect(); + client = undefined; + } + + if (!client) { + client = io(config.host + "/cs", { + transports: ["websocket", "polling"] + }); + + client.auth = { + isAdmin: true, + token: user.token + }; + + client.on("connect", () => { + console.log("[cs] connect"); + }); + + client.on("disconnect", () => { + console.log("[cs] disconnect"); + }); + + client.on("msg", (data: Cs.Msg) => { + if ((data.type == 1 && data.userId != user.info?.id) || data.type == 0) { + // 判断是否是当前会话 + if (data.sessionId == session.info?.id) { + message.append({ + ...data.user, + ...data + }); + } else { + // 设置其他会话信息 + session.list.forEach((e) => { + if (e.id == data.sessionId) { + if (!e.adminUnreadCount) { + e.adminUnreadCount = 0; + } + + e.adminUnreadCount += 1; + e.lastMsg = data; + } + }); + } + + // 发送事件 + mitt.emit("cs.msg", data); + } + }); + } + } + + function send(content: Cs.Content) { + if (client) { + // 发送事件 + client.emit("send", { + sessionId: session.info?.id, + content + }); + + // 追加消息 + message.append({ content }); + } else { + console.log("[cs] client error"); + } + } + + return { + connect, + client, + send + }; +}); diff --git a/src/modules/cs/hooks/tools.ts b/src/modules/cs/hooks/tools.ts new file mode 100644 index 0000000..354a862 --- /dev/null +++ b/src/modules/cs/hooks/tools.ts @@ -0,0 +1,28 @@ +import { defineStore } from "pinia"; +import { nextTick, ref } from "vue"; + +export const useTools = defineStore("cs.tools", () => { + // 是否展开 + const isExpand = ref(true); + + // 收起、展开 + function expand(value?: boolean) { + isExpand.value = value === undefined ? !isExpand.value : value; + } + + // 滚动到底部 + async function scrollToBottom() { + await nextTick(); + + document.querySelector(".cs-message .el-scrollbar__wrap")?.scroll({ + top: 9999, + behavior: "smooth" + }); + } + + return { + isExpand, + expand, + scrollToBottom + }; +}); diff --git a/src/modules/cs/index.ts b/src/modules/cs/index.ts new file mode 100644 index 0000000..b740056 --- /dev/null +++ b/src/modules/cs/index.ts @@ -0,0 +1,13 @@ +import { useMessage, useSession, useSocket } from "./hooks"; + +export function useCs() { + const socket = useSocket(); + const message = useMessage(); + const session = useSession(); + + return { + socket, + message, + session + }; +} diff --git a/src/modules/cs/static/audio/ding.wav b/src/modules/cs/static/audio/ding.wav new file mode 100644 index 0000000..0479aa8 Binary files /dev/null and b/src/modules/cs/static/audio/ding.wav differ diff --git a/src/modules/cs/static/emoji/angry-face.png b/src/modules/cs/static/emoji/angry-face.png new file mode 100644 index 0000000..bd0b383 Binary files /dev/null and b/src/modules/cs/static/emoji/angry-face.png differ diff --git a/src/modules/cs/static/emoji/anguished-face.png b/src/modules/cs/static/emoji/anguished-face.png new file mode 100644 index 0000000..fa4678b Binary files /dev/null and b/src/modules/cs/static/emoji/anguished-face.png differ diff --git a/src/modules/cs/static/emoji/astonished-face.png b/src/modules/cs/static/emoji/astonished-face.png new file mode 100644 index 0000000..41dc2b6 Binary files /dev/null and b/src/modules/cs/static/emoji/astonished-face.png differ diff --git a/src/modules/cs/static/emoji/confounded-face.png b/src/modules/cs/static/emoji/confounded-face.png new file mode 100644 index 0000000..7e1b967 Binary files /dev/null and b/src/modules/cs/static/emoji/confounded-face.png differ diff --git a/src/modules/cs/static/emoji/confused-face.png b/src/modules/cs/static/emoji/confused-face.png new file mode 100644 index 0000000..b01d70e Binary files /dev/null and b/src/modules/cs/static/emoji/confused-face.png differ diff --git a/src/modules/cs/static/emoji/crying-face.png b/src/modules/cs/static/emoji/crying-face.png new file mode 100644 index 0000000..c5aae1c Binary files /dev/null and b/src/modules/cs/static/emoji/crying-face.png differ diff --git a/src/modules/cs/static/emoji/disappointed-but-relieved-face.png b/src/modules/cs/static/emoji/disappointed-but-relieved-face.png new file mode 100644 index 0000000..f4f6e3e Binary files /dev/null and b/src/modules/cs/static/emoji/disappointed-but-relieved-face.png differ diff --git a/src/modules/cs/static/emoji/disappointed-face.png b/src/modules/cs/static/emoji/disappointed-face.png new file mode 100644 index 0000000..aa3e501 Binary files /dev/null and b/src/modules/cs/static/emoji/disappointed-face.png differ diff --git a/src/modules/cs/static/emoji/dizzy-face.png b/src/modules/cs/static/emoji/dizzy-face.png new file mode 100644 index 0000000..9bd63d4 Binary files /dev/null and b/src/modules/cs/static/emoji/dizzy-face.png differ diff --git a/src/modules/cs/static/emoji/drooling-face.png b/src/modules/cs/static/emoji/drooling-face.png new file mode 100644 index 0000000..a7e2545 Binary files /dev/null and b/src/modules/cs/static/emoji/drooling-face.png differ diff --git a/src/modules/cs/static/emoji/expressionless-face.png b/src/modules/cs/static/emoji/expressionless-face.png new file mode 100644 index 0000000..a39bc99 Binary files /dev/null and b/src/modules/cs/static/emoji/expressionless-face.png differ diff --git a/src/modules/cs/static/emoji/face-savouring-delicious-food.png b/src/modules/cs/static/emoji/face-savouring-delicious-food.png new file mode 100644 index 0000000..7f3d434 Binary files /dev/null and b/src/modules/cs/static/emoji/face-savouring-delicious-food.png differ diff --git a/src/modules/cs/static/emoji/face-screaming-in-fear.png b/src/modules/cs/static/emoji/face-screaming-in-fear.png new file mode 100644 index 0000000..0458687 Binary files /dev/null and b/src/modules/cs/static/emoji/face-screaming-in-fear.png differ diff --git a/src/modules/cs/static/emoji/face-throwing-a-kiss.png b/src/modules/cs/static/emoji/face-throwing-a-kiss.png new file mode 100644 index 0000000..15220bf Binary files /dev/null and b/src/modules/cs/static/emoji/face-throwing-a-kiss.png differ diff --git a/src/modules/cs/static/emoji/face-with-cold-sweat.png b/src/modules/cs/static/emoji/face-with-cold-sweat.png new file mode 100644 index 0000000..c91ab17 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-cold-sweat.png differ diff --git a/src/modules/cs/static/emoji/face-with-cowboy-hat.png b/src/modules/cs/static/emoji/face-with-cowboy-hat.png new file mode 100644 index 0000000..5801afc Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-cowboy-hat.png differ diff --git a/src/modules/cs/static/emoji/face-with-finger-covering-closed-lips.png b/src/modules/cs/static/emoji/face-with-finger-covering-closed-lips.png new file mode 100644 index 0000000..3e37c47 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-finger-covering-closed-lips.png differ diff --git a/src/modules/cs/static/emoji/face-with-head-bandage.png b/src/modules/cs/static/emoji/face-with-head-bandage.png new file mode 100644 index 0000000..00471c0 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-head-bandage.png differ diff --git a/src/modules/cs/static/emoji/face-with-look-of-triumph.png b/src/modules/cs/static/emoji/face-with-look-of-triumph.png new file mode 100644 index 0000000..fa3bb8e Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-look-of-triumph.png differ diff --git a/src/modules/cs/static/emoji/face-with-medical-mask.png b/src/modules/cs/static/emoji/face-with-medical-mask.png new file mode 100644 index 0000000..8b237f5 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-medical-mask.png differ diff --git a/src/modules/cs/static/emoji/face-with-monocle.png b/src/modules/cs/static/emoji/face-with-monocle.png new file mode 100644 index 0000000..12982a9 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-monocle.png differ diff --git a/src/modules/cs/static/emoji/face-with-one-eyebrow-raised.png b/src/modules/cs/static/emoji/face-with-one-eyebrow-raised.png new file mode 100644 index 0000000..c14f913 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-one-eyebrow-raised.png differ diff --git a/src/modules/cs/static/emoji/face-with-open-mouth-and-cold-sweat.png b/src/modules/cs/static/emoji/face-with-open-mouth-and-cold-sweat.png new file mode 100644 index 0000000..9359dd9 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-open-mouth-and-cold-sweat.png differ diff --git a/src/modules/cs/static/emoji/face-with-open-mouth-vomiting.png b/src/modules/cs/static/emoji/face-with-open-mouth-vomiting.png new file mode 100644 index 0000000..637be5f Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-open-mouth-vomiting.png differ diff --git a/src/modules/cs/static/emoji/face-with-open-mouth.png b/src/modules/cs/static/emoji/face-with-open-mouth.png new file mode 100644 index 0000000..6b9af1e Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-open-mouth.png differ diff --git a/src/modules/cs/static/emoji/face-with-party-horn-and-party-hat.png b/src/modules/cs/static/emoji/face-with-party-horn-and-party-hat.png new file mode 100644 index 0000000..d1d3f27 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-party-horn-and-party-hat.png differ diff --git a/src/modules/cs/static/emoji/face-with-pleading-eyes.png b/src/modules/cs/static/emoji/face-with-pleading-eyes.png new file mode 100644 index 0000000..3901299 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-pleading-eyes.png differ diff --git a/src/modules/cs/static/emoji/face-with-rolling-eyes.png b/src/modules/cs/static/emoji/face-with-rolling-eyes.png new file mode 100644 index 0000000..3c1c933 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-rolling-eyes.png differ diff --git a/src/modules/cs/static/emoji/face-with-stuck-out-tongue-and-tightly-closed-eyes.png b/src/modules/cs/static/emoji/face-with-stuck-out-tongue-and-tightly-closed-eyes.png new file mode 100644 index 0000000..13e5574 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-stuck-out-tongue-and-tightly-closed-eyes.png differ diff --git a/src/modules/cs/static/emoji/face-with-stuck-out-tongue-and-winking-eye.png b/src/modules/cs/static/emoji/face-with-stuck-out-tongue-and-winking-eye.png new file mode 100644 index 0000000..3c6c276 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-stuck-out-tongue-and-winking-eye.png differ diff --git a/src/modules/cs/static/emoji/face-with-stuck-out-tongue.png b/src/modules/cs/static/emoji/face-with-stuck-out-tongue.png new file mode 100644 index 0000000..9b040b3 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-stuck-out-tongue.png differ diff --git a/src/modules/cs/static/emoji/face-with-thermometer.png b/src/modules/cs/static/emoji/face-with-thermometer.png new file mode 100644 index 0000000..407c0c8 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-thermometer.png differ diff --git a/src/modules/cs/static/emoji/face-with-uneven-eyes-and-wavy-mouth.png b/src/modules/cs/static/emoji/face-with-uneven-eyes-and-wavy-mouth.png new file mode 100644 index 0000000..3777295 Binary files /dev/null and b/src/modules/cs/static/emoji/face-with-uneven-eyes-and-wavy-mouth.png differ diff --git a/src/modules/cs/static/emoji/face-without-mouth.png b/src/modules/cs/static/emoji/face-without-mouth.png new file mode 100644 index 0000000..8a2fbf3 Binary files /dev/null and b/src/modules/cs/static/emoji/face-without-mouth.png differ diff --git a/src/modules/cs/static/emoji/fearful-face.png b/src/modules/cs/static/emoji/fearful-face.png new file mode 100644 index 0000000..f1927f0 Binary files /dev/null and b/src/modules/cs/static/emoji/fearful-face.png differ diff --git a/src/modules/cs/static/emoji/flushed-face.png b/src/modules/cs/static/emoji/flushed-face.png new file mode 100644 index 0000000..adad5ca Binary files /dev/null and b/src/modules/cs/static/emoji/flushed-face.png differ diff --git a/src/modules/cs/static/emoji/freezing-face.png b/src/modules/cs/static/emoji/freezing-face.png new file mode 100644 index 0000000..97a9310 Binary files /dev/null and b/src/modules/cs/static/emoji/freezing-face.png differ diff --git a/src/modules/cs/static/emoji/frowning-face-with-open-mouth.png b/src/modules/cs/static/emoji/frowning-face-with-open-mouth.png new file mode 100644 index 0000000..1ec8ac6 Binary files /dev/null and b/src/modules/cs/static/emoji/frowning-face-with-open-mouth.png differ diff --git a/src/modules/cs/static/emoji/grimacing-face.png b/src/modules/cs/static/emoji/grimacing-face.png new file mode 100644 index 0000000..82ca911 Binary files /dev/null and b/src/modules/cs/static/emoji/grimacing-face.png differ diff --git a/src/modules/cs/static/emoji/grinning-face-with-one-large-and-one-small-eye.png b/src/modules/cs/static/emoji/grinning-face-with-one-large-and-one-small-eye.png new file mode 100644 index 0000000..7f3ec34 Binary files /dev/null and b/src/modules/cs/static/emoji/grinning-face-with-one-large-and-one-small-eye.png differ diff --git a/src/modules/cs/static/emoji/grinning-face-with-smiling-eyes.png b/src/modules/cs/static/emoji/grinning-face-with-smiling-eyes.png new file mode 100644 index 0000000..d90a62d Binary files /dev/null and b/src/modules/cs/static/emoji/grinning-face-with-smiling-eyes.png differ diff --git a/src/modules/cs/static/emoji/grinning-face-with-star-eyes.png b/src/modules/cs/static/emoji/grinning-face-with-star-eyes.png new file mode 100644 index 0000000..9d3a098 Binary files /dev/null and b/src/modules/cs/static/emoji/grinning-face-with-star-eyes.png differ diff --git a/src/modules/cs/static/emoji/grinning-face.png b/src/modules/cs/static/emoji/grinning-face.png new file mode 100644 index 0000000..56e7da7 Binary files /dev/null and b/src/modules/cs/static/emoji/grinning-face.png differ diff --git a/src/modules/cs/static/emoji/hugging-face.png b/src/modules/cs/static/emoji/hugging-face.png new file mode 100644 index 0000000..edc9e01 Binary files /dev/null and b/src/modules/cs/static/emoji/hugging-face.png differ diff --git a/src/modules/cs/static/emoji/hushed-face.png b/src/modules/cs/static/emoji/hushed-face.png new file mode 100644 index 0000000..f236530 Binary files /dev/null and b/src/modules/cs/static/emoji/hushed-face.png differ diff --git a/src/modules/cs/static/emoji/imp.png b/src/modules/cs/static/emoji/imp.png new file mode 100644 index 0000000..7a4bcdb Binary files /dev/null and b/src/modules/cs/static/emoji/imp.png differ diff --git a/src/modules/cs/static/emoji/kissing-face-with-closed-eyes.png b/src/modules/cs/static/emoji/kissing-face-with-closed-eyes.png new file mode 100644 index 0000000..a16080e Binary files /dev/null and b/src/modules/cs/static/emoji/kissing-face-with-closed-eyes.png differ diff --git a/src/modules/cs/static/emoji/kissing-face-with-smiling-eyes.png b/src/modules/cs/static/emoji/kissing-face-with-smiling-eyes.png new file mode 100644 index 0000000..f041364 Binary files /dev/null and b/src/modules/cs/static/emoji/kissing-face-with-smiling-eyes.png differ diff --git a/src/modules/cs/static/emoji/kissing-face.png b/src/modules/cs/static/emoji/kissing-face.png new file mode 100644 index 0000000..7f57e24 Binary files /dev/null and b/src/modules/cs/static/emoji/kissing-face.png differ diff --git a/src/modules/cs/static/emoji/loudly-crying-face.png b/src/modules/cs/static/emoji/loudly-crying-face.png new file mode 100644 index 0000000..37bc4fd Binary files /dev/null and b/src/modules/cs/static/emoji/loudly-crying-face.png differ diff --git a/src/modules/cs/static/emoji/lying-face.png b/src/modules/cs/static/emoji/lying-face.png new file mode 100644 index 0000000..a7af452 Binary files /dev/null and b/src/modules/cs/static/emoji/lying-face.png differ diff --git a/src/modules/cs/static/emoji/money-mouth-face.png b/src/modules/cs/static/emoji/money-mouth-face.png new file mode 100644 index 0000000..e72b3b8 Binary files /dev/null and b/src/modules/cs/static/emoji/money-mouth-face.png differ diff --git a/src/modules/cs/static/emoji/nauseated-face.png b/src/modules/cs/static/emoji/nauseated-face.png new file mode 100644 index 0000000..2b30261 Binary files /dev/null and b/src/modules/cs/static/emoji/nauseated-face.png differ diff --git a/src/modules/cs/static/emoji/nerd-face.png b/src/modules/cs/static/emoji/nerd-face.png new file mode 100644 index 0000000..c915863 Binary files /dev/null and b/src/modules/cs/static/emoji/nerd-face.png differ diff --git a/src/modules/cs/static/emoji/neutral-face.png b/src/modules/cs/static/emoji/neutral-face.png new file mode 100644 index 0000000..8fc3f3e Binary files /dev/null and b/src/modules/cs/static/emoji/neutral-face.png differ diff --git a/src/modules/cs/static/emoji/overheated-face.png b/src/modules/cs/static/emoji/overheated-face.png new file mode 100644 index 0000000..b8c9f63 Binary files /dev/null and b/src/modules/cs/static/emoji/overheated-face.png differ diff --git a/src/modules/cs/static/emoji/pensive-face.png b/src/modules/cs/static/emoji/pensive-face.png new file mode 100644 index 0000000..1eefb52 Binary files /dev/null and b/src/modules/cs/static/emoji/pensive-face.png differ diff --git a/src/modules/cs/static/emoji/persevering-face.png b/src/modules/cs/static/emoji/persevering-face.png new file mode 100644 index 0000000..daa2cc0 Binary files /dev/null and b/src/modules/cs/static/emoji/persevering-face.png differ diff --git a/src/modules/cs/static/emoji/pouting-face.png b/src/modules/cs/static/emoji/pouting-face.png new file mode 100644 index 0000000..398f18a Binary files /dev/null and b/src/modules/cs/static/emoji/pouting-face.png differ diff --git a/src/modules/cs/static/emoji/relieved-face.png b/src/modules/cs/static/emoji/relieved-face.png new file mode 100644 index 0000000..502f517 Binary files /dev/null and b/src/modules/cs/static/emoji/relieved-face.png differ diff --git a/src/modules/cs/static/emoji/rolling-on-the-floor-laughing.png b/src/modules/cs/static/emoji/rolling-on-the-floor-laughing.png new file mode 100644 index 0000000..2eabc38 Binary files /dev/null and b/src/modules/cs/static/emoji/rolling-on-the-floor-laughing.png differ diff --git a/src/modules/cs/static/emoji/serious-face-with-symbols-covering-mouth.png b/src/modules/cs/static/emoji/serious-face-with-symbols-covering-mouth.png new file mode 100644 index 0000000..c5c95e0 Binary files /dev/null and b/src/modules/cs/static/emoji/serious-face-with-symbols-covering-mouth.png differ diff --git a/src/modules/cs/static/emoji/shocked-face-with-exploding-head.png b/src/modules/cs/static/emoji/shocked-face-with-exploding-head.png new file mode 100644 index 0000000..c939400 Binary files /dev/null and b/src/modules/cs/static/emoji/shocked-face-with-exploding-head.png differ diff --git a/src/modules/cs/static/emoji/sleeping-face.png b/src/modules/cs/static/emoji/sleeping-face.png new file mode 100644 index 0000000..749e4ee Binary files /dev/null and b/src/modules/cs/static/emoji/sleeping-face.png differ diff --git a/src/modules/cs/static/emoji/sleepy-face.png b/src/modules/cs/static/emoji/sleepy-face.png new file mode 100644 index 0000000..21b72c1 Binary files /dev/null and b/src/modules/cs/static/emoji/sleepy-face.png differ diff --git a/src/modules/cs/static/emoji/slightly-frowning-face.png b/src/modules/cs/static/emoji/slightly-frowning-face.png new file mode 100644 index 0000000..8608109 Binary files /dev/null and b/src/modules/cs/static/emoji/slightly-frowning-face.png differ diff --git a/src/modules/cs/static/emoji/slightly-smiling-face.png b/src/modules/cs/static/emoji/slightly-smiling-face.png new file mode 100644 index 0000000..a0d68d1 Binary files /dev/null and b/src/modules/cs/static/emoji/slightly-smiling-face.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-halo.png b/src/modules/cs/static/emoji/smiling-face-with-halo.png new file mode 100644 index 0000000..0cd0b3d Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-halo.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-heart-shaped-eyes.png b/src/modules/cs/static/emoji/smiling-face-with-heart-shaped-eyes.png new file mode 100644 index 0000000..2cefcb5 Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-heart-shaped-eyes.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-horns.png b/src/modules/cs/static/emoji/smiling-face-with-horns.png new file mode 100644 index 0000000..f0b56af Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-horns.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-open-mouth-and-smiling-eyes.png b/src/modules/cs/static/emoji/smiling-face-with-open-mouth-and-smiling-eyes.png new file mode 100644 index 0000000..a702c93 Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-open-mouth-and-smiling-eyes.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-open-mouth-and-tightly-closed-eyes.png b/src/modules/cs/static/emoji/smiling-face-with-open-mouth-and-tightly-closed-eyes.png new file mode 100644 index 0000000..83ebaa5 Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-open-mouth-and-tightly-closed-eyes.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-open-mouth.png b/src/modules/cs/static/emoji/smiling-face-with-open-mouth.png new file mode 100644 index 0000000..7798b41 Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-open-mouth.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes-and-hand-covering-mouth.png b/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes-and-hand-covering-mouth.png new file mode 100644 index 0000000..27777df Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes-and-hand-covering-mouth.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes-and-three-hearts.png b/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes-and-three-hearts.png new file mode 100644 index 0000000..d621f0d Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes-and-three-hearts.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes.png b/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes.png new file mode 100644 index 0000000..69700dc Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-smiling-eyes.png differ diff --git a/src/modules/cs/static/emoji/smiling-face-with-sunglasses.png b/src/modules/cs/static/emoji/smiling-face-with-sunglasses.png new file mode 100644 index 0000000..2a70eff Binary files /dev/null and b/src/modules/cs/static/emoji/smiling-face-with-sunglasses.png differ diff --git a/src/modules/cs/static/emoji/smirking-face.png b/src/modules/cs/static/emoji/smirking-face.png new file mode 100644 index 0000000..430d45b Binary files /dev/null and b/src/modules/cs/static/emoji/smirking-face.png differ diff --git a/src/modules/cs/static/emoji/sneezing-face.png b/src/modules/cs/static/emoji/sneezing-face.png new file mode 100644 index 0000000..18f5b95 Binary files /dev/null and b/src/modules/cs/static/emoji/sneezing-face.png differ diff --git a/src/modules/cs/static/emoji/thinking-face.png b/src/modules/cs/static/emoji/thinking-face.png new file mode 100644 index 0000000..7431ed0 Binary files /dev/null and b/src/modules/cs/static/emoji/thinking-face.png differ diff --git a/src/modules/cs/static/emoji/tired-face.png b/src/modules/cs/static/emoji/tired-face.png new file mode 100644 index 0000000..ff0898f Binary files /dev/null and b/src/modules/cs/static/emoji/tired-face.png differ diff --git a/src/modules/cs/static/emoji/upside-down-face.png b/src/modules/cs/static/emoji/upside-down-face.png new file mode 100644 index 0000000..677f746 Binary files /dev/null and b/src/modules/cs/static/emoji/upside-down-face.png differ diff --git a/src/modules/cs/static/emoji/weary-face.png b/src/modules/cs/static/emoji/weary-face.png new file mode 100644 index 0000000..74325b9 Binary files /dev/null and b/src/modules/cs/static/emoji/weary-face.png differ diff --git a/src/modules/cs/static/emoji/white-frowning-face.png b/src/modules/cs/static/emoji/white-frowning-face.png new file mode 100644 index 0000000..3644ff5 Binary files /dev/null and b/src/modules/cs/static/emoji/white-frowning-face.png differ diff --git a/src/modules/cs/static/emoji/white-smiling-face.png b/src/modules/cs/static/emoji/white-smiling-face.png new file mode 100644 index 0000000..082b271 Binary files /dev/null and b/src/modules/cs/static/emoji/white-smiling-face.png differ diff --git a/src/modules/cs/static/emoji/winking-face.png b/src/modules/cs/static/emoji/winking-face.png new file mode 100644 index 0000000..59c99e0 Binary files /dev/null and b/src/modules/cs/static/emoji/winking-face.png differ diff --git a/src/modules/cs/static/emoji/worried-face.png b/src/modules/cs/static/emoji/worried-face.png new file mode 100644 index 0000000..8638920 Binary files /dev/null and b/src/modules/cs/static/emoji/worried-face.png differ diff --git a/src/modules/cs/static/emoji/zipper-mouth-face.png b/src/modules/cs/static/emoji/zipper-mouth-face.png new file mode 100644 index 0000000..79e02a3 Binary files /dev/null and b/src/modules/cs/static/emoji/zipper-mouth-face.png differ diff --git a/src/modules/cs/types/index.d.ts b/src/modules/cs/types/index.d.ts new file mode 100644 index 0000000..2256fa8 --- /dev/null +++ b/src/modules/cs/types/index.d.ts @@ -0,0 +1,13 @@ +export declare namespace Cs { + interface Content { + type: "text" | "image" | "voice" | "video" | "file" | "link" | "location" | "emoji"; + data: string; + } + + interface Msg extends Eps.CsMsgEntity { + content: Content; + sessionId?: number; + } + + interface Session extends Eps.CsSessionEntity {} +} diff --git a/src/modules/cs/utils/index.ts b/src/modules/cs/utils/index.ts new file mode 100644 index 0000000..9499acb --- /dev/null +++ b/src/modules/cs/utils/index.ts @@ -0,0 +1,52 @@ +import dayjs from "dayjs"; +import type { Cs } from "../types"; + +// 消息格式化 +export function msgFormatter(msg: Cs.Msg) { + if (!msg) { + return ""; + } + + switch (msg.content.type) { + case "text": + return msg.content.data; + + case "emoji": + return "【表情】"; + + case "image": + return "【图片】"; + + case "link": + return "【链接】"; + + case "voice": + return "【音频】"; + + case "file": + return "【文件】"; + + case "video": + return "【视频】"; + + case "location": + return "【定位】"; + } +} + +// 日期格式化 +export function dateFormatter(date?: Date) { + const t = dayjs(date); + + // 在今天之前 + if (t.isBefore(dayjs().hour(0).minute(0).second(0))) { + return t.format("YYYY-MM-DD HH:mm"); + } else { + return t.format("HH:mm"); + } +} + +// 表情链接 +export function getEmoji(name: string) { + return new URL(`../static/emoji/${name}`, import.meta.url).href; +} diff --git a/src/modules/cs/views/chat.vue b/src/modules/cs/views/chat.vue new file mode 100644 index 0000000..a25aa0c --- /dev/null +++ b/src/modules/cs/views/chat.vue @@ -0,0 +1,175 @@ + + + diff --git a/src/modules/demo/config.ts b/src/modules/demo/config.ts new file mode 100644 index 0000000..13c4911 --- /dev/null +++ b/src/modules/demo/config.ts @@ -0,0 +1,27 @@ +import { type ModuleConfig } from '/@/cool'; + +export default (): ModuleConfig => { + return { + components: [() => import('./views/crud/components/code.vue')], + + views: [ + { + // 单个参数 + // path: "/demo/test/route/:id", + + // 多个参数 + // path: "/demo/test/route/:id/:name", + + // 参数可选 + path: '/demo/test/route/:id/:name?', + + // 更多看文档:https://router.vuejs.org/zh/guide/essentials/route-matching-syntax.html + + meta: { + label: '动态路由参数' + }, + component: () => import('./views/test/route.vue') + } + ] + }; +}; diff --git a/src/modules/demo/directives/color.ts b/src/modules/demo/directives/color.ts new file mode 100644 index 0000000..8c5b1c6 --- /dev/null +++ b/src/modules/demo/directives/color.ts @@ -0,0 +1,5 @@ +export default { + created(el: HTMLElement, binding: any) { + el.style.color = binding.value; + } +}; diff --git a/src/modules/demo/locales/en.json b/src/modules/demo/locales/en.json new file mode 100644 index 0000000..20572fb --- /dev/null +++ b/src/modules/demo/locales/en.json @@ -0,0 +1,54 @@ +{ + "浏览量": "Views", + "访客数": "Visitors", + "总用户数": "Total Users", + "日增用户数": "Daily New Users", + "付款笔数": "Payment Transactions", + "转化率": "Conversion Rate", + "总销售额": "Total Sales", + "周同比": "Week-on-Week", + "日同比": "Day-on-Day", + "类别占比": "Category Share", + "启用": "Enabled", + "描述": "Description", + "未知": "Unknown", + "男": "Male", + "女": "Female", + "禁用": "Disabled", + "正常": "Normal", + "已注销": "Canceled", + "小程序": "Mini Program", + "公众号": "Official Account", + "H5": "H5", + "登录唯一ID": "Login Unique ID", + "头像": "Avatar", + "昵称": "Nickname", + "手机号": "Mobile Phone Number", + "性别": "Gender", + "状态": "Status", + "登录方式": "Login Method", + "来源": "Source", + "密码": "Password", + "介绍": "Introduction", + "余额": "Balance", + "标题": "Title", + "ID": "ID", + "创建时间": "Create Time", + "更新时间": "Update Time", + "搜索手机号、昵称": "Search Mobile Number, Nickname", + "{year}年": "{year} Year", + "销售金额": "Sales Amount", + "销售订单": "Sales Order", + "{i}月": "{i} Month", + "热门商品排行": "Popular Product Ranking", + "今日": "Today", + "本周": "This Week", + "本月": "This Month", + "全年": "Full Year", + "排名": "Ranking", + "商品名称": "Product Name", + "商品金额": "Product Amount", + "下单次数": "Order Placed Times", + "日涨幅": "Daily Increase", + "上架时间": "Listing Time" +} \ No newline at end of file diff --git a/src/modules/demo/locales/zh-cn.json b/src/modules/demo/locales/zh-cn.json new file mode 100644 index 0000000..8182c78 --- /dev/null +++ b/src/modules/demo/locales/zh-cn.json @@ -0,0 +1,54 @@ +{ + "未知": "未知", + "男": "男", + "女": "女", + "禁用": "禁用", + "正常": "正常", + "已注销": "已注销", + "小程序": "小程序", + "公众号": "公众号", + "H5": "H5", + "登录唯一ID": "登录唯一ID", + "头像": "头像", + "昵称": "昵称", + "手机号": "手机号", + "性别": "性别", + "状态": "状态", + "登录方式": "登录方式", + "来源": "来源", + "密码": "密码", + "介绍": "介绍", + "余额": "余额", + "标题": "标题", + "ID": "ID", + "创建时间": "创建时间", + "更新时间": "更新时间", + "搜索手机号、昵称": "搜索手机号、昵称", + "{year}年": "{year}年", + "销售金额": "销售金额", + "销售订单": "销售订单", + "{i}月": "{i}月", + "热门商品排行": "热门商品排行", + "今日": "今日", + "本周": "本周", + "本月": "本月", + "全年": "全年", + "排名": "排名", + "商品名称": "商品名称", + "商品金额": "商品金额", + "下单次数": "下单次数", + "日涨幅": "日涨幅", + "上架时间": "上架时间", + "浏览量": "浏览量", + "访客数": "访客数", + "总用户数": "总用户数", + "日增用户数": "日增用户数", + "付款笔数": "付款笔数", + "转化率": "转化率", + "总销售额": "总销售额", + "周同比": "周同比", + "日同比": "日同比", + "类别占比": "类别占比", + "启用": "启用", + "描述": "描述" +} \ No newline at end of file diff --git a/src/modules/demo/locales/zh-tw.json b/src/modules/demo/locales/zh-tw.json new file mode 100644 index 0000000..74117a5 --- /dev/null +++ b/src/modules/demo/locales/zh-tw.json @@ -0,0 +1,54 @@ +{ + "浏览量": "瀏覽量", + "访客数": "訪客數", + "总用户数": "總用戶數", + "日增用户数": "日增用戶數", + "付款笔数": "付款筆數", + "转化率": "轉化率", + "总销售额": "總銷售額", + "周同比": "周同比", + "日同比": "日同比", + "类别占比": "類別占比", + "启用": "啟用", + "描述": "描述", + "未知": "未知", + "男": "男", + "女": "女", + "禁用": "禁用", + "正常": "正常", + "已注销": "已註銷", + "小程序": "小程序", + "公众号": "公眾號", + "H5": "H5", + "登录唯一ID": "登錄唯一ID", + "头像": "頭像", + "昵称": "暱稱", + "手机号": "手機號", + "性别": "性別", + "状态": "狀態", + "登录方式": "登錄方式", + "来源": "來源", + "密码": "密碼", + "介绍": "介紹", + "余额": "餘額", + "标题": "標題", + "ID": "ID", + "创建时间": "創建時間", + "更新时间": "更新時間", + "搜索手机号、昵称": "搜索手機號、暱稱", + "{year}年": "{year}年", + "销售金额": "銷售金額", + "销售订单": "銷售訂單", + "{i}月": "{i}月", + "热门商品排行": "熱門商品排行", + "今日": "今日", + "本周": "本周", + "本月": "本月", + "全年": "全年", + "排名": "排名", + "商品名称": "商品名稱", + "商品金额": "商品金額", + "下单次数": "下單次數", + "日涨幅": "日漲幅", + "上架时间": "上架時間" +} \ No newline at end of file diff --git a/src/modules/demo/views/crud/components/adv-search/base.vue b/src/modules/demo/views/crud/components/adv-search/base.vue new file mode 100644 index 0000000..0b74d4a --- /dev/null +++ b/src/modules/demo/views/crud/components/adv-search/base.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/modules/demo/views/crud/components/adv-search/custom.vue b/src/modules/demo/views/crud/components/adv-search/custom.vue new file mode 100644 index 0000000..94ce40c --- /dev/null +++ b/src/modules/demo/views/crud/components/adv-search/custom.vue @@ -0,0 +1,152 @@ + + + diff --git a/src/modules/demo/views/crud/components/code.vue b/src/modules/demo/views/crud/components/code.vue new file mode 100644 index 0000000..96b90f1 --- /dev/null +++ b/src/modules/demo/views/crud/components/code.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/all.vue b/src/modules/demo/views/crud/components/crud/all.vue new file mode 100644 index 0000000..bea553f --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/all.vue @@ -0,0 +1,578 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/base.vue b/src/modules/demo/views/crud/components/crud/base.vue new file mode 100644 index 0000000..b3851af --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/base.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/dict.vue b/src/modules/demo/views/crud/components/crud/dict.vue new file mode 100644 index 0000000..da64ac8 --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/dict.vue @@ -0,0 +1,164 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/event.vue b/src/modules/demo/views/crud/components/crud/event.vue new file mode 100644 index 0000000..f75dd27 --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/event.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/select-table.vue b/src/modules/demo/views/crud/components/crud/select-table.vue new file mode 100644 index 0000000..0a4a33c --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/select-table.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/service.vue b/src/modules/demo/views/crud/components/crud/service.vue new file mode 100644 index 0000000..fda349b --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/service.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/modules/demo/views/crud/components/crud/user-select.vue b/src/modules/demo/views/crud/components/crud/user-select.vue new file mode 100644 index 0000000..afbd6ab --- /dev/null +++ b/src/modules/demo/views/crud/components/crud/user-select.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/children.vue b/src/modules/demo/views/crud/components/form/children.vue new file mode 100644 index 0000000..3730ef4 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/children.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/component/index.vue b/src/modules/demo/views/crud/components/form/component/index.vue new file mode 100644 index 0000000..c404408 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/component/index.vue @@ -0,0 +1,124 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/component/select-labels.vue b/src/modules/demo/views/crud/components/form/component/select-labels.vue new file mode 100644 index 0000000..e21e5af --- /dev/null +++ b/src/modules/demo/views/crud/components/form/component/select-labels.vue @@ -0,0 +1,42 @@ + + + + diff --git a/src/modules/demo/views/crud/components/form/component/select-status.vue b/src/modules/demo/views/crud/components/form/component/select-status.vue new file mode 100644 index 0000000..2dfabea --- /dev/null +++ b/src/modules/demo/views/crud/components/form/component/select-status.vue @@ -0,0 +1,47 @@ + + + + diff --git a/src/modules/demo/views/crud/components/form/component/select-work.vue b/src/modules/demo/views/crud/components/form/component/select-work.vue new file mode 100644 index 0000000..6ff625f --- /dev/null +++ b/src/modules/demo/views/crud/components/form/component/select-work.vue @@ -0,0 +1,63 @@ + + + + diff --git a/src/modules/demo/views/crud/components/form/component/select-work2.vue b/src/modules/demo/views/crud/components/form/component/select-work2.vue new file mode 100644 index 0000000..818a215 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/component/select-work2.vue @@ -0,0 +1,42 @@ + + + + diff --git a/src/modules/demo/views/crud/components/form/config.vue b/src/modules/demo/views/crud/components/form/config.vue new file mode 100644 index 0000000..32d6604 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/config.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/crud.vue b/src/modules/demo/views/crud/components/form/crud.vue new file mode 100644 index 0000000..ca4d892 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/crud.vue @@ -0,0 +1,151 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/disabled.vue b/src/modules/demo/views/crud/components/form/disabled.vue new file mode 100644 index 0000000..1a109ad --- /dev/null +++ b/src/modules/demo/views/crud/components/form/disabled.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/event.vue b/src/modules/demo/views/crud/components/form/event.vue new file mode 100644 index 0000000..201ecf8 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/event.vue @@ -0,0 +1,93 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/group.vue b/src/modules/demo/views/crud/components/form/group.vue new file mode 100644 index 0000000..fc2e07b --- /dev/null +++ b/src/modules/demo/views/crud/components/form/group.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/hidden.vue b/src/modules/demo/views/crud/components/form/hidden.vue new file mode 100644 index 0000000..e28a665 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/hidden.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/layout.vue b/src/modules/demo/views/crud/components/form/layout.vue new file mode 100644 index 0000000..b4ab074 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/layout.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/open.vue b/src/modules/demo/views/crud/components/form/open.vue new file mode 100644 index 0000000..8105135 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/open.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/options.vue b/src/modules/demo/views/crud/components/form/options.vue new file mode 100644 index 0000000..8c51305 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/options.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/plugin/index.vue b/src/modules/demo/views/crud/components/form/plugin/index.vue new file mode 100644 index 0000000..bd65b40 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/plugin/index.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/plugin/role.ts b/src/modules/demo/views/crud/components/form/plugin/role.ts new file mode 100644 index 0000000..f924c1e --- /dev/null +++ b/src/modules/demo/views/crud/components/form/plugin/role.ts @@ -0,0 +1,20 @@ +/** + * 角色权限控制 + * @param role + * @returns + */ +export function setRole(role?: string): ClForm.Plugin { + return ({ exposed }) => { + function deep(arr: ClForm.Item[]) { + arr.forEach(e => { + if (e.role) { + e.hidden = e.role != role; + } + + deep(e.children || []); + }); + } + + deep(exposed.config.items); + }; +} diff --git a/src/modules/demo/views/crud/components/form/required.vue b/src/modules/demo/views/crud/components/form/required.vue new file mode 100644 index 0000000..7de191f --- /dev/null +++ b/src/modules/demo/views/crud/components/form/required.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/modules/demo/views/crud/components/form/rules.vue b/src/modules/demo/views/crud/components/form/rules.vue new file mode 100644 index 0000000..818f8d5 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/rules.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/modules/demo/views/crud/components/form/setFocus.vue b/src/modules/demo/views/crud/components/form/setFocus.vue new file mode 100644 index 0000000..467e039 --- /dev/null +++ b/src/modules/demo/views/crud/components/form/setFocus.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/modules/demo/views/crud/components/other/context-menu.vue b/src/modules/demo/views/crud/components/other/context-menu.vue new file mode 100644 index 0000000..3551d16 --- /dev/null +++ b/src/modules/demo/views/crud/components/other/context-menu.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/modules/demo/views/crud/components/other/tips.vue b/src/modules/demo/views/crud/components/other/tips.vue new file mode 100644 index 0000000..15d545d --- /dev/null +++ b/src/modules/demo/views/crud/components/other/tips.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/modules/demo/views/crud/components/other/tsx/index.scss b/src/modules/demo/views/crud/components/other/tsx/index.scss new file mode 100644 index 0000000..bd99427 --- /dev/null +++ b/src/modules/demo/views/crud/components/other/tsx/index.scss @@ -0,0 +1,28 @@ +.tsx-list { + .item { + display: flex; + align-items: center; + justify-content: space-between; + border: 1px solid var(--el-border-color); + padding: 10px; + margin-bottom: 10px; + cursor: pointer; + border-radius: var(--el-border-radius-base); + + .el-icon { + display: none; + } + + &:hover { + background-color: var(--el-bg-color-page); + } + + &.is-active { + color: var(--el-color-primary); + + .el-icon { + display: block; + } + } + } +} diff --git a/src/modules/demo/views/crud/components/other/tsx/index.tsx b/src/modules/demo/views/crud/components/other/tsx/index.tsx new file mode 100644 index 0000000..ae3396b --- /dev/null +++ b/src/modules/demo/views/crud/components/other/tsx/index.tsx @@ -0,0 +1,109 @@ +import { defineComponent, ref } from 'vue'; +import { Check } from '@element-plus/icons-vue'; +import './index.scss'; + +interface Item { + name: string; + value: number; +} + +export default defineComponent({ + emits: ['checked'], + + setup(props, { emit, expose, slots }) { + // 列表数据 + const list = ref([ + { + name: '鸡腿堡', + value: 1 + }, + { + name: '牛肉堡', + value: 2 + } + ]); + + // 选择值 + const active = ref(); + + // 是否可见 + const visible = ref(false); + + // 打开 + function open() { + visible.value = true; + } + + // 选择 + function toCheck(item: Item) { + active.value = item.value; + + // 自定义事件 + emit('checked', item); + } + + // 暴露方法和变量,使上级可以使用 ref 的方式来调用 + expose({ + toCheck + }); + + // 必须返回一个方法 + return () => { + return ( +
+
+ + tsx + + tsx示例 +
+ +
+ 预览 + + + {/* ref 的绑定值必须 .value */} + +
+ {/* 循环的使用 */} + {list.value.map(item => { + // 插槽的使用 + return slots.default ? ( + slots.default(item) + ) : ( +
toCheck(item)} + > + {item.name} + + + + +
+ ); + })} +
+
+
+ +
+ 2024-01-01 +
+
+ ); + }; + } + + // 不推荐用该方法,在 setup 中返回模板信息 + // render() { + // return
; + // } +}); diff --git a/src/modules/demo/views/crud/components/search/base.vue b/src/modules/demo/views/crud/components/search/base.vue new file mode 100644 index 0000000..ef9c311 --- /dev/null +++ b/src/modules/demo/views/crud/components/search/base.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/modules/demo/views/crud/components/search/collapse.vue b/src/modules/demo/views/crud/components/search/collapse.vue new file mode 100644 index 0000000..afcb4ad --- /dev/null +++ b/src/modules/demo/views/crud/components/search/collapse.vue @@ -0,0 +1,110 @@ + + + +x diff --git a/src/modules/demo/views/crud/components/search/custom.vue b/src/modules/demo/views/crud/components/search/custom.vue new file mode 100644 index 0000000..51e8bf7 --- /dev/null +++ b/src/modules/demo/views/crud/components/search/custom.vue @@ -0,0 +1,176 @@ + + + diff --git a/src/modules/demo/views/crud/components/search/layout.vue b/src/modules/demo/views/crud/components/search/layout.vue new file mode 100644 index 0000000..ae4d3ee --- /dev/null +++ b/src/modules/demo/views/crud/components/search/layout.vue @@ -0,0 +1,149 @@ + + + diff --git a/src/modules/demo/views/crud/components/search/plugin.vue b/src/modules/demo/views/crud/components/search/plugin.vue new file mode 100644 index 0000000..93ba5a3 --- /dev/null +++ b/src/modules/demo/views/crud/components/search/plugin.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/base.vue b/src/modules/demo/views/crud/components/table/base.vue new file mode 100644 index 0000000..053a3cd --- /dev/null +++ b/src/modules/demo/views/crud/components/table/base.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/children.vue b/src/modules/demo/views/crud/components/table/children.vue new file mode 100644 index 0000000..fd4b71f --- /dev/null +++ b/src/modules/demo/views/crud/components/table/children.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/column-custom.vue b/src/modules/demo/views/crud/components/table/column-custom.vue new file mode 100644 index 0000000..c362331 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/column-custom.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/component/index.vue b/src/modules/demo/views/crud/components/table/component/index.vue new file mode 100644 index 0000000..005d153 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/component/index.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/component/user-info.vue b/src/modules/demo/views/crud/components/table/component/user-info.vue new file mode 100644 index 0000000..f4fd232 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/component/user-info.vue @@ -0,0 +1,34 @@ + + + + + + diff --git a/src/modules/demo/views/crud/components/table/context-menu.vue b/src/modules/demo/views/crud/components/table/context-menu.vue new file mode 100644 index 0000000..43f77f4 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/context-menu.vue @@ -0,0 +1,191 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/dict.vue b/src/modules/demo/views/crud/components/table/dict.vue new file mode 100644 index 0000000..083297d --- /dev/null +++ b/src/modules/demo/views/crud/components/table/dict.vue @@ -0,0 +1,156 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/formatter.vue b/src/modules/demo/views/crud/components/table/formatter.vue new file mode 100644 index 0000000..3cd0172 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/formatter.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/hidden.vue b/src/modules/demo/views/crud/components/table/hidden.vue new file mode 100644 index 0000000..c81ad16 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/hidden.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/op.vue b/src/modules/demo/views/crud/components/table/op.vue new file mode 100644 index 0000000..d15cbe0 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/op.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/plugin/base.vue b/src/modules/demo/views/crud/components/table/plugin/base.vue new file mode 100644 index 0000000..d8f2445 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/plugin/base.vue @@ -0,0 +1,130 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/plugin/row-edit.vue b/src/modules/demo/views/crud/components/table/plugin/row-edit.vue new file mode 100644 index 0000000..de8c2d0 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/plugin/row-edit.vue @@ -0,0 +1,124 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/plugin/to-tree.vue b/src/modules/demo/views/crud/components/table/plugin/to-tree.vue new file mode 100644 index 0000000..d2c58be --- /dev/null +++ b/src/modules/demo/views/crud/components/table/plugin/to-tree.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/search.vue b/src/modules/demo/views/crud/components/table/search.vue new file mode 100644 index 0000000..88cb8ea --- /dev/null +++ b/src/modules/demo/views/crud/components/table/search.vue @@ -0,0 +1,137 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/selection.vue b/src/modules/demo/views/crud/components/table/selection.vue new file mode 100644 index 0000000..87549ac --- /dev/null +++ b/src/modules/demo/views/crud/components/table/selection.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/slot.vue b/src/modules/demo/views/crud/components/table/slot.vue new file mode 100644 index 0000000..929ddb1 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/slot.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/span-method.vue b/src/modules/demo/views/crud/components/table/span-method.vue new file mode 100644 index 0000000..d752ed9 --- /dev/null +++ b/src/modules/demo/views/crud/components/table/span-method.vue @@ -0,0 +1,115 @@ + + + diff --git a/src/modules/demo/views/crud/components/table/summary.vue b/src/modules/demo/views/crud/components/table/summary.vue new file mode 100644 index 0000000..05e37cf --- /dev/null +++ b/src/modules/demo/views/crud/components/table/summary.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/modules/demo/views/crud/components/upsert/base.vue b/src/modules/demo/views/crud/components/upsert/base.vue new file mode 100644 index 0000000..96f76d0 --- /dev/null +++ b/src/modules/demo/views/crud/components/upsert/base.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/modules/demo/views/crud/components/upsert/event.vue b/src/modules/demo/views/crud/components/upsert/event.vue new file mode 100644 index 0000000..e7b15a9 --- /dev/null +++ b/src/modules/demo/views/crud/components/upsert/event.vue @@ -0,0 +1,210 @@ + + + diff --git a/src/modules/demo/views/crud/components/upsert/hook/index.vue b/src/modules/demo/views/crud/components/upsert/hook/index.vue new file mode 100644 index 0000000..f5dfcc0 --- /dev/null +++ b/src/modules/demo/views/crud/components/upsert/hook/index.vue @@ -0,0 +1,200 @@ + + + diff --git a/src/modules/demo/views/crud/components/upsert/hook/reg-pca2.ts b/src/modules/demo/views/crud/components/upsert/hook/reg-pca2.ts new file mode 100644 index 0000000..472a9c8 --- /dev/null +++ b/src/modules/demo/views/crud/components/upsert/hook/reg-pca2.ts @@ -0,0 +1,14 @@ +import { registerFormHook } from '@cool-vue/crud'; + +// 注册 hook +registerFormHook('pca2', (value, { method, form, prop }) => { + if (method == 'bind') { + return [form.province, form.city, form.district]; + } else { + const [province, city, district] = value || []; + form.province = province; + form.city = city; + form.district = district; + form[prop] = undefined; + } +}); diff --git a/src/modules/demo/views/crud/components/upsert/mode.vue b/src/modules/demo/views/crud/components/upsert/mode.vue new file mode 100644 index 0000000..1b7fb8d --- /dev/null +++ b/src/modules/demo/views/crud/components/upsert/mode.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/modules/demo/views/crud/index.vue b/src/modules/demo/views/crud/index.vue new file mode 100644 index 0000000..a7a712d --- /dev/null +++ b/src/modules/demo/views/crud/index.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/src/modules/demo/views/home/components/category-ratio.vue b/src/modules/demo/views/home/components/category-ratio.vue new file mode 100644 index 0000000..d8f6159 --- /dev/null +++ b/src/modules/demo/views/home/components/category-ratio.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/modules/demo/views/home/components/count-effect.vue b/src/modules/demo/views/home/components/count-effect.vue new file mode 100644 index 0000000..845b446 --- /dev/null +++ b/src/modules/demo/views/home/components/count-effect.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/modules/demo/views/home/components/count-paid.vue b/src/modules/demo/views/home/components/count-paid.vue new file mode 100644 index 0000000..c33d996 --- /dev/null +++ b/src/modules/demo/views/home/components/count-paid.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/modules/demo/views/home/components/count-user.vue b/src/modules/demo/views/home/components/count-user.vue new file mode 100644 index 0000000..aee2948 --- /dev/null +++ b/src/modules/demo/views/home/components/count-user.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/modules/demo/views/home/components/count-views.vue b/src/modules/demo/views/home/components/count-views.vue new file mode 100644 index 0000000..5e591c8 --- /dev/null +++ b/src/modules/demo/views/home/components/count-views.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/modules/demo/views/home/components/hot-goods.vue b/src/modules/demo/views/home/components/hot-goods.vue new file mode 100644 index 0000000..8c02f23 --- /dev/null +++ b/src/modules/demo/views/home/components/hot-goods.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/modules/demo/views/home/components/tab-chart.vue b/src/modules/demo/views/home/components/tab-chart.vue new file mode 100644 index 0000000..0656b78 --- /dev/null +++ b/src/modules/demo/views/home/components/tab-chart.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/src/modules/demo/views/home/index.vue b/src/modules/demo/views/home/index.vue new file mode 100644 index 0000000..34ea22a --- /dev/null +++ b/src/modules/demo/views/home/index.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/modules/demo/views/test/route.vue b/src/modules/demo/views/test/route.vue new file mode 100644 index 0000000..9f438f1 --- /dev/null +++ b/src/modules/demo/views/test/route.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/modules/dict/config.ts b/src/modules/dict/config.ts new file mode 100644 index 0000000..291820c --- /dev/null +++ b/src/modules/dict/config.ts @@ -0,0 +1,16 @@ +import { type ModuleConfig } from '/@/cool'; +import { useDict } from './index'; + +export default (): ModuleConfig => { + return { + ignore: { + NProgress: ['/dict/info/data'] + }, + onLoad({ hasToken }) { + const { dict } = useDict(); + hasToken(() => { + dict.refresh(); + }); + } + }; +}; diff --git a/src/modules/dict/index.ts b/src/modules/dict/index.ts new file mode 100644 index 0000000..26e543e --- /dev/null +++ b/src/modules/dict/index.ts @@ -0,0 +1,7 @@ +import { useStore } from './store'; + +export function useDict() { + return { + ...useStore() + }; +} diff --git a/src/modules/dict/locales/en.json b/src/modules/dict/locales/en.json new file mode 100644 index 0000000..60e2043 --- /dev/null +++ b/src/modules/dict/locales/en.json @@ -0,0 +1,16 @@ +{ + "搜索名称": "Search Name", + "请填写值": "Please fill in the value", + "使用文件": "Use File", + "类型": "Type", + "字典列表": "Dictionary List", + "名称": "Name", + "上级节点": "Parent Node", + "值": "Value", + "排序": "Sort", + "备注": "Remarks", + "新增": "Add", + "ID": "ID", + "创建时间": "Create Time", + "更新时间": "Update Time" +} \ No newline at end of file diff --git a/src/modules/dict/locales/zh-cn.json b/src/modules/dict/locales/zh-cn.json new file mode 100644 index 0000000..196194c --- /dev/null +++ b/src/modules/dict/locales/zh-cn.json @@ -0,0 +1,16 @@ +{ + "搜索名称": "搜索名称", + "请填写值": "请填写值", + "使用文件": "使用文件", + "类型": "类型", + "字典列表": "字典列表", + "名称": "名称", + "上级节点": "上级节点", + "值": "值", + "排序": "排序", + "备注": "备注", + "新增": "新增", + "ID": "ID", + "创建时间": "创建时间", + "更新时间": "更新时间" +} \ No newline at end of file diff --git a/src/modules/dict/locales/zh-tw.json b/src/modules/dict/locales/zh-tw.json new file mode 100644 index 0000000..f91fb7a --- /dev/null +++ b/src/modules/dict/locales/zh-tw.json @@ -0,0 +1,16 @@ +{ + "搜索名称": "搜尋名稱", + "请填写值": "請填寫值", + "使用文件": "使用文件", + "类型": "類型", + "字典列表": "字典列表", + "名称": "名稱", + "上级节点": "上級節點", + "值": "值", + "排序": "排序", + "备注": "備註", + "新增": "新增", + "ID": "ID", + "创建时间": "創建時間", + "更新时间": "更新時間" +} \ No newline at end of file diff --git a/src/modules/dict/store/dict.ts b/src/modules/dict/store/dict.ts new file mode 100644 index 0000000..f4c3638 --- /dev/null +++ b/src/modules/dict/store/dict.ts @@ -0,0 +1,65 @@ +import { defineStore } from 'pinia'; +import { computed, reactive, toRaw } from 'vue'; +import { service } from '/@/cool'; +import { deepTree } from '/@/cool/utils'; +import { isDev } from '/@/config'; +import { assign, isArray, orderBy } from 'lodash-es'; +import { deepFind, isEmpty } from '../utils'; + +const useDictStore = defineStore('dict', () => { + // 对象数据 + const data = reactive({}); + + // 获取 + function get(name: Dict.Key, sort?: 'desc' | 'asc') { + return computed(() => orderBy(data[name] || [], 'orderNum', sort)); + } + + // 查找 + function find(name: Dict.Key, value: any | any[]) { + const arr = isArray(value) ? value : [value]; + return arr.filter(e => e !== undefined).map(v => deepFind(v, get(name).value)); + } + + // 刷新 + async function refresh(types?: Dict.Key[]) { + return service.dict.info + .data({ + types: types?.filter(e => !isEmpty(e)) + }) + .then((res: Dict.Data) => { + const d = {}; + + for (const [i, arr] of Object.entries(res)) { + arr.forEach(e => { + e.label = e.name; + + if (isEmpty(e.value)) { + e.value = e.id; + } + }); + + d[i] = deepTree(arr, 'desc'); + } + + assign(data, d); + + if (isDev) { + console.group('字典数据'); + console.log(toRaw(data)); + console.groupEnd(); + } + + return data; + }); + } + + return { + data, + get, + find, + refresh + }; +}); + +export { useDictStore }; diff --git a/src/modules/dict/store/index.ts b/src/modules/dict/store/index.ts new file mode 100644 index 0000000..9261de5 --- /dev/null +++ b/src/modules/dict/store/index.ts @@ -0,0 +1,9 @@ +import { useDictStore } from './dict'; + +export function useStore() { + const dict = useDictStore(); + + return { + dict + }; +} diff --git a/src/modules/dict/types/index.d.ts b/src/modules/dict/types/index.d.ts new file mode 100644 index 0000000..d2cd99d --- /dev/null +++ b/src/modules/dict/types/index.d.ts @@ -0,0 +1,15 @@ +namespace Dict { + type Key = Eps.DictKey | (string & {}); + + interface Item { + id: string; + label: string; + value: any; + children?: Item[]; + [key: string]: any; + } + + interface Data { + [key: string]: Item[]; + } +} diff --git a/src/modules/dict/utils/index.ts b/src/modules/dict/utils/index.ts new file mode 100644 index 0000000..cf19f63 --- /dev/null +++ b/src/modules/dict/utils/index.ts @@ -0,0 +1,31 @@ +export function deepFind(value: any, list: any[], options?: { allLevels: boolean }) { + const { allLevels = true } = options || {}; + + function deep(arr: any[], name: string[]): any | undefined { + for (const e of arr) { + if (e.value === value) { + if (allLevels) { + return { + ...e, + label: [...name, e.label].join(' / ') + }; + } else { + return e; + } + } else if (e.children) { + const d = deep(e.children, [...name, e.label]); + + if (d !== undefined) { + return d; + } + } + } + return undefined; + } + + return deep(list, []); +} + +export function isEmpty(val: any) { + return val === '' || val === null || val === undefined; +} diff --git a/src/modules/dict/views/list.vue b/src/modules/dict/views/list.vue new file mode 100644 index 0000000..6d2859b --- /dev/null +++ b/src/modules/dict/views/list.vue @@ -0,0 +1,281 @@ + + + diff --git a/src/modules/helper/components/ai-code/btn.vue b/src/modules/helper/components/ai-code/btn.vue new file mode 100644 index 0000000..b40449c --- /dev/null +++ b/src/modules/helper/components/ai-code/btn.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/modules/helper/components/ai-code/dev.vue b/src/modules/helper/components/ai-code/dev.vue new file mode 100644 index 0000000..6aaf325 --- /dev/null +++ b/src/modules/helper/components/ai-code/dev.vue @@ -0,0 +1,76 @@ +