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
+
+
+
+ base
+ 起步
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 自定义 示例
+
+```vue
+
+
+
+ custom
+ 自定义
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 更多搜索
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 自定义
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
\ 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
+
+
+
+ all
+ 完整示例
+
+
+
+
预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.id }}
+
+
+
+ {{ scope.row.name }}
+
+
+
+ {{ scope.row.wages }}
+
+
+
+ {{ scope.row.createTime }}
+
+
+
+
+
+
+
+ {{ scope.row.wages }}🤑
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 起步 示例
+
+```vue
+
+
+
+ base
+ 起步
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 修改文案 / 接口 示例
+
+```vue
+
+
+
+ dict
+ 修改文案 / 接口
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 事件监听 示例
+
+```vue
+
+
+
+ event
+ 事件监听
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 自定义事件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 选择表格 示例
+
+```vue
+
+
+
+ select-table
+ 选择表格
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2025-02-07
+
+
+
+
+
+
+```
+
+## Service 配置 示例
+
+```vue
+
+
+
+ service
+ Service 配置
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 选择成员 示例
+
+```vue
+
+
+
+ user-select
+ 选择成员
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2025-02-07
+
+
+
+
+
+
+```
\ 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
+
+
+
+ children
+ 层级显示
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 组件渲染 示例
+
+```vue
+
+
+
+ component
+ 组件渲染
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## select-labels 示例
+
+```vue
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## select-status 示例
+
+```vue
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+```
+
+## select-work 示例
+
+```vue
+
+
+
+
+
+
+
+
+
+```
+
+## select-work2 示例
+
+```vue
+
+
+
+
+
+
+
+
+
+```
+
+## 参数配置 示例
+
+```vue
+
+
+
+ config
+ 参数配置
+
+
+
+ 预览
+
+
+
+
+
+
+ 按钮插槽
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 内嵌CRUD 示例
+
+```vue
+
+
+
+ crud
+ 内嵌CRUD
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 组件禁用 示例
+
+```vue
+
+
+
+ disabled
+ 组件禁用
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 组件事件 示例
+
+```vue
+
+
+
+ event
+ 组件事件
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 分组显示 示例
+
+```vue
+
+
+
+ group
+ 分组显示
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 隐藏/显示 示例
+
+```vue
+
+
+
+ hidden
+ 隐藏/显示
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 布局 示例
+
+```vue
+
+
+
+ layout
+ 布局
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 起步 示例
+
+```vue
+
+
+
+ open
+ 起步
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 选项框配置 示例
+
+```vue
+
+
+
+ options
+ 选项框配置
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 插件的使用 示例
+
+```vue
+
+
+
+ plugin
+ 插件的使用
+
+
+
+ 管理者
+ 用户
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 必填项配置 示例
+
+```vue
+
+
+
+ required
+ 必填项配置
+
+
+
+ 预览
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 添加/删除表单项 示例
+
+```vue
+
+
+
+ rules
+ 添加/删除表单项
+
+
+
+
预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加证书
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+
+
+```
\ 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
+
+
+
+ base
+ 起步
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 折叠 示例
+
+```vue
+
+
+
+ collapse
+ 折叠
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-12-26
+
+
+
+
+
+x
+
+```
+
+## 自定义 示例
+
+```vue
+
+
+
+ custom
+ 自定义
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+ 自定义按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 布局 示例
+
+```vue
+
+
+
+ layout
+ 布局
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 使用插件 示例
+
+```vue
+
+
+
+ plugin
+ 使用插件
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
\ 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
+
+
+
+ base
+ 起步
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 多级表头 示例
+
+```vue
+
+
+
+ children
+ 多级表头
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 自定义列展示 示例
+
+```vue
+
+
+
+ column-custom
+ 自定义列展示
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 组件渲染 示例
+
+```vue
+
+
+
+ component
+ 组件渲染
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## user-info 示例
+
+```vue
+
+
+
+
+
+
+
+
+
+```
+
+## 右键菜单 示例
+
+```vue
+
+
+
+ context-menu
+ 右键菜单
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 字典匹配 示例
+
+```vue
+
+
+
+ dict
+ 字典匹配
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 数据格式化 示例
+
+```vue
+
+
+
+ formatter
+ 数据格式化
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-09-26
+
+
+
+
+
+
+```
+
+## 隐藏/显示 示例
+
+```vue
+
+
+
+ hidden
+ 隐藏/显示
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 显示账号
+
+
+ 隐藏账号
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 操作栏 示例
+
+```vue
+
+
+
+ op
+ 操作栏
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+ {
+ ElMessage.info(scope.row.name);
+ }
+ "
+ >插槽按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 插件的使用 示例
+
+```vue
+
+
+
+ plugin
+ 插件的使用
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 行编辑 示例
+
+```vue
+
+
+
+ row-edit
+ 行编辑
+
+
+
+ 预览
+
+
+
+
+
+ 点击姓名、手机号可以进行编辑
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 表头搜索 示例
+
+```vue
+
+
+
+ search
+ 表头搜索
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 多选框数据 示例
+
+```vue
+
+
+
+ selection
+ 多选框数据
+
+
+
+ 预览
+
+
+
+
+
+
+ 选中2行
+
+ 取消选择
+
+
+
+
+
+
+
+
+ 已选 {{ Table?.selection.length }} 人
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 插槽的使用 示例
+
+```vue
+
+
+
+ slot
+ 插槽的使用
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+ 📱{{ scope.row.phone }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 合并行或列 示例
+
+```vue
+
+
+
+ span-method
+ 合并行或列
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 表尾合计行 示例
+
+```vue
+
+
+
+ summary
+ 表尾合计行
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
\ 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
+
+
+
+ base
+ 起步
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 打开、关闭、提交等事件 示例
+
+```vue
+
+
+
+ event
+ 打开、关闭、提交等事件
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## Hook的使用 示例
+
+```vue
+
+
+
+ hook
+ Hook的使用
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
+
+## 新增、编辑、详情模式 示例
+
+```vue
+
+
+
+ mode
+ 新增、编辑、详情模式
+
+
+
+ 预览
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2024-01-01
+
+
+
+
+
+
+```
\ 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 一个很酷的后台权限管理系统,开源免费,模块化、插件化、极速开发 CRUD,方便快速构建迭代后台管理系统, 到文档 进一步了解
+
+
+
+
+
+
+
+## 特性
+
+Ai时代,很多老旧的框架已经无法满足现代化的开发需求,Cool-Admin开发了一系列的功能,让开发变得更简单、更快速、更高效。
+
+- **Ai编码**:通过微调大模型学习框架特有写法,实现简单功能从Api接口到前端页面的一键生成
+- **流程编排**:通过拖拽编排方式,即可实现类似像智能客服这样的功能
+- **模块化**:代码是模块化的,清晰明了,方便维护
+- **插件化**:插件化的设计,可以通过安装插件的方式扩展如:支付、短信、邮件等功能
+
+
+
+## 地址
+
+- [📌 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
+
+
+
+## 项目后端
+
+[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)
+
+## 微信群
+
+
+
+## 安装项目依赖
+
+推荐使用 `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 @@
+
+
+
CRUD DEMO v8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 (
+
+
+ {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 (
+
+ );
+ }
+
+ return (
+ visible.value && (
+
+ )
+ );
+ };
+ }
+});
+
+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 || (
+
+ )
+ );
+ }
+
+ 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 (
+
+ );
+ };
+ }
+});
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 (
+
+ );
+ };
+ }
+});
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 (
+
+
+
+ {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 (
+
+ );
+ }
+
+ // 渲染表单底部按钮
+ 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 = (
+
+ );
+
+ // 输入框
+ 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 (
+
+ );
+}
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