2025年04月03日18:21:15

This commit is contained in:
luojiayi 2025-04-03 18:21:17 +08:00
parent 7f6112b211
commit 26fa338589
20 changed files with 1331 additions and 340 deletions

1
.env.development Normal file
View File

@ -0,0 +1 @@
VITE_APP_URL = 'http://192.168.3.116:8001'

3
.env.production Normal file
View File

@ -0,0 +1,3 @@
VITE_APP_URL = 'http://192.168.3.116:8001/'

1
components.d.ts vendored
View File

@ -45,6 +45,7 @@ declare module '@vue/runtime-core' {
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElUpload: typeof import('element-plus/es')['ElUpload']
Header: typeof import('./src/components/header.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']

View File

@ -22,6 +22,7 @@
"md-editor-v3": "^2.11.2",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^4.2.0",
"vue": "^3.4.5",
"vue-cropper": "1.1.1",
"vue-echarts": "^6.6.9",

152
src/api/index.d.ts vendored Normal file
View File

@ -0,0 +1,152 @@
export interface Ipaging {
page: number;
size: number;
}
export interface IpagingRes<T> {
size: number
current: number
total: number
pages: number
records: T[]
}
export namespace TLogin {
export interface Ireq {
username: string;
password: string;
}
export interface IRes {
orgId: string
orgName: string
roleId: number
token: string
username: string
warnMusic: number
}
}
export namespace TAccount {
export interface IAdd {
username: string;
password: string;
phone: string;
name: string;
orgId: number;
roleId: number;
status: number;
}
export interface IListReq extends Ipaging {
orgId?: number;
}
export interface Idel {
id: number;
}
export interface IResetPwd {
id: number;
password: string;
}
export interface IListRes {
id: number
orgId: number
roleId: number
flag: boolean
name: string
username: string
password: string
phone: string
orgName: string
updateUser: string
updateTime: string
creatUser: string
createTime: string
}
}
export namespace TDevice {
export interface IListReq extends Ipaging {
orgId?: number;
}
export interface IListRes {
id: number
deviceId: number
accountId: number
orgId: number
status: number
deviceSwitch: number
mode: number
monitorMode: number
battery: number
name: string
username: string
password: string
phone: string
orgName: string
deviceVersion: string
updateUser: string
updateTime: string
creatUser: string
createTime: string
}
export interface ISetMonitor {
deviceId: number;
mode?: number;
cmd?: string;
}
export interface IRecordReq extends Ipaging {
deviceId?: number;
}
export interface IRecordRes {
id: number
deviceId: number
accountId: number
orgId: number
status: number
deviceSwitch: number
mode: number
monitorMode: number
battery: number
name: string
username: string
password: string
phone: string
orgName: string
deviceVersion: string
updateUser: string
updateTime: string
creatUser: string
createTime: string
}
export interface IUseRecordRes {
id: number
accountId: number
userNumber: string
adminName: string
adminType: string
deviceId: string
phone: string
orgId: number
orgName: string
status: number
updateUser: string
updateTime: string
creatUser: string
createTime: string
}
export interface IWarningRecordRes {
id: number
userNumber: string
deviceId: string
warnType: number
status: number
updateUser: string
updateTime: string
creatUser: string
createTime: string
}
}

View File

@ -1,22 +1,141 @@
import request from '../utils/request';
import { TLogin, TAccount, IpagingRes, TDevice } from "./index.d";
export const fetchData = () => {
return request({
url: './mock/table.json',
method: 'get'
});
export const fetchLogin = (p: TLogin.Ireq): Promise<TLogin.IRes> => {
return request({
url: '/v1/web/login',
method: 'post',
data: p
});
};
export const fetchData = () => {
return request({
url: './mock/table.json',
method: 'get'
});
};
export const fetchUserData = () => {
return request({
url: './mock/user.json',
method: 'get'
});
return request({
url: './mock/user.json',
method: 'get'
});
};
export const fetchRoleData = () => {
return request({
url: './mock/role.json',
method: 'get'
});
return request({
url: './mock/role.json',
method: 'get'
});
};
// -------------------------------------------------------------------------------------------------------------------
// 添加用户
export const accountAdd = (p: TAccount.IAdd): Promise<null> => {
return request({
url: '/v1/web/account/add',
method: 'post',
data: p
});
};
// 删除用户
export const accountDeletet = (p: TAccount.Idel): Promise<null> => {
return request({
url: '/v1/web/account/delete',
method: 'post',
data: p
});
};
// 修改用户
export const accountModify = (p: TAccount.IAdd): Promise<null> => {
return request({
url: '/v1/web/account/modify',
method: 'post',
data: p
});
};
// 获取用户列表
export const accountList = (p: TAccount.IListReq): Promise<IpagingRes<TAccount.IListRes>> => {
return request({
url: '/v1/web/account/list',
method: 'get',
params: p
});
};
// 重置密码
export const passwordReset = (p: TAccount.IResetPwd): Promise<null> => {
return request({
url: '/v1/web/account/password/reset',
method: 'post',
data: p
});
};
// 获取设备列表
export const deviceList = (p: TDevice.IListReq): Promise<IpagingRes<TDevice.IListRes>> => {
return request({
url: '/v1/web/device/list',
method: 'get',
params: p
});
};
// 设置监测模式
export const setMonitor = (p: TDevice.ISetMonitor): Promise<null> => {
return request({
url: '/v1/web/device/set/monitor',
method: 'post',
data: p
});
};
// 设置模式
export const setMode = (p: TDevice.ISetMonitor): Promise<null> => {
return request({
url: '/v1/web/device/set/mode',
method: 'post',
data: p
});
};
// 获取定位
export const deviceGetLocation = (p: TDevice.ISetMonitor): Promise<null> => {
return request({
url: '/v1/web/device/getLocation',
method: 'post',
data: p
});
};
// 设备控制
export const deviceControl = (p: TDevice.ISetMonitor): Promise<null> => {
return request({
url: '/v1/web/device/control',
method: 'post',
data: p
});
};
// 设备使用记录
export const deviceUseRecord = (p: TDevice.IRecordReq): Promise<IpagingRes<TDevice.IUseRecordRes>> => {
return request({
url: '/v1/web/device/use/record',
method: 'get',
params: p
});
};
// 预警记录
export const warningRecord = (p: TDevice.IRecordReq): Promise<IpagingRes<TDevice.IWarningRecordRes>> => {
return request({
url: '/v1/web/device/warning/record',
method: 'get',
params: p
});
};

View File

@ -7,7 +7,7 @@
{{ item }}{{ index != tab.list.length - 1 ? " / " : "" }}
</div>
</div>
<div class="web-time">{{ format(comm.time) }}</div>
<div class="web-time">{{ format(time) }}</div>
</div>
<div class="header-right">
<div class="header-user-con">
@ -33,7 +33,7 @@
<!-- 用户名下拉菜单 -->
<el-dropdown class="user-name" trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
{{ username }}
{{ user.username }}
<el-icon class="el-icon--right">
<arrow-down />
</el-icon>
@ -61,11 +61,11 @@ import { format } from "@/utils";
const tab = useTabsStore();
const username: string | null = localStorage.getItem("vuems_name");
const message: number = 2;
const sidebar = useSidebarStore();
const comm = useCommonStore();
const { user, time, clearStore } = useCommonStore();
// onMounted(() => {
// if (document.body.clientWidth < 1500) {
// sidebar.handleCollapse();
@ -76,7 +76,7 @@ const comm = useCommonStore();
const router = useRouter();
const handleCommand = (command: string) => {
if (command == "loginout") {
localStorage.removeItem("vuems_name");
clearStore();
router.push("/login");
} else if (command == "user") {
router.push("/ucenter");

View File

@ -13,27 +13,27 @@
</el-tooltip>
<el-divider direction="vertical" />
</template>
<el-tooltip effect="dark" content="刷新" placement="top">
<el-icon class="columns-setting-icon" @click="refresh">
<Refresh />
</el-icon>
</el-tooltip>
<el-divider direction="vertical" />
<el-tooltip effect="dark" content="列设置" placement="top">
<el-dropdown :hide-on-click="false" size="small" trigger="click">
<el-icon class="columns-setting-icon">
<Setting />
</el-icon>
<template #dropdown>
<el-tooltip effect="dark" content="刷新" placement="top">
<el-icon class="columns-setting-icon" @click="refresh">
<Refresh />
</el-icon>
</el-tooltip>
<el-divider direction="vertical" />
<el-tooltip effect="dark" content="列设置" placement="top">
<el-dropdown :hide-on-click="false" size="small" trigger="click">
<el-icon class="columns-setting-icon">
<Setting />
</el-icon>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="c in columns">
<el-checkbox v-model="c.visible" :label="c.label" />
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-tooltip>
</div> -->
</el-dropdown>
</el-tooltip>
</div> -->
</div>
<el-table
class="mgb20"
@ -192,8 +192,8 @@ const getIndex = (index: number) => {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 10px;
border-bottom: 1px solid #dedede;
/* margin-bottom: 10px; */
/* border-bottom: 1px solid #dedede; */
padding-bottom: 22px;
}

View File

@ -4,12 +4,15 @@ import * as ElementPlusIconsVue from '@element-plus/icons-vue';
import App from './App.vue';
import router from './router';
import { usePermissStore } from './store/permiss';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import 'element-plus/dist/index.css';
import './assets/css/icon.css';
import { ElNotification } from 'element-plus'
const app = createApp(App);
app.use(createPinia());
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
app.use(pinia);
app.use(router);
// 注册elementplus图标

View File

@ -1,15 +1,24 @@
import { defineStore } from 'pinia';
import { TLogin } from "@/api/index.d";
export const useCommonStore = defineStore('common', {
state: () => {
return {
time: new Date()
time: new Date(),
user: <TLogin.IRes>{}
};
},
getters: {},
actions: {
setTime() {
this.time = new Date();
},
setUser(data: TLogin.IRes) {
this.user = data
},
clearStore() {
this.$reset();
}
}
},
persist: true
});

View File

@ -1,60 +1,59 @@
import { defineStore } from 'pinia';
interface ObjectList {
[key: string]: string[];
[key: string]: string[];
}
export const usePermissStore = defineStore('permiss', {
state: () => {
const defaultList: ObjectList = {
admin: [
'0',
'1',
'11',
'12',
'13',
'2',
'21',
'22',
'23',
'24',
'25',
'26',
'27',
'28',
'29',
'291',
'292',
'3',
'31',
'32',
'33',
'34',
'4',
'41',
'42',
'5',
'7',
'6',
'61',
'62',
'63',
'64',
'65',
'66',
],
user: ['0', '1', '11', '12', '13'],
};
const username = localStorage.getItem('vuems_name');
console.log(username);
return {
key: (username == 'admin' ? defaultList.admin : defaultList.user) as string[],
defaultList,
};
},
actions: {
handleSet(val: string[]) {
this.key = val;
},
state: () => {
const defaultList: ObjectList = {
admin: [
'0',
'1',
'11',
'12',
'13',
'2',
'21',
'22',
'23',
'24',
'25',
'26',
'27',
'28',
'29',
'291',
'292',
'3',
'31',
'32',
'33',
'34',
'4',
'41',
'42',
'5',
'7',
'6',
'61',
'62',
'63',
'64',
'65',
'66',
],
user: ['0', '1', '11', '12', '13'],
};
const username = localStorage.getItem('vuems_name');
return {
key: (username == 'admin' ? defaultList.admin : defaultList.user) as string[],
defaultList,
};
},
actions: {
handleSet(val: string[]) {
this.key = val;
},
},
});

View File

@ -1,21 +1,22 @@
export interface FormOption {
list: FormOptionList[];
labelWidth?: number | string;
span?: number;
list: FormOptionList[];
labelWidth?: number | string;
span?: number;
}
export interface FormOptionList {
prop: string;
label: string;
type: string;
placeholder?: string;
disabled?: boolean;
opts?: any[];
format?: string;
activeValue?: any;
inactiveValue?: any;
activeText?: string;
inactiveText?: string;
required?: boolean;
prop: string;
label: string;
type: string;
placeholder?: string;
disabled?: boolean;
opts?: any[];
format?: string;
activeValue?: any;
inactiveValue?: any;
activeText?: string;
inactiveText?: string;
required?: boolean;
validator?: Function;
}

21
src/utils/hooks.ts Normal file
View File

@ -0,0 +1,21 @@
import { computed } from "vue";
export function useVModel(props, propsName, emit) {
return computed({
get: () => {
return new Proxy(props[propsName], {
get(target, key, receiver) {
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
emit(`update:${propsName}`, { ...target, [key]: value });
return true;
},
});
},
set: (val) => {
emit(`update:${propsName}`, val);
},
});
}

View File

@ -1,31 +1,49 @@
import axios, { AxiosInstance, AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
import { ElMessage } from "element-plus";
import { useCommonStore } from "@/store/common";
import router from "@/router/index";
const service: AxiosInstance = axios.create({
timeout: 5000
baseURL: import.meta.env.VITE_APP_URL,
timeout: 5000
});
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
return config;
},
(error: AxiosError) => {
console.log(error);
return Promise.reject();
}
(config: InternalAxiosRequestConfig) => {
const comm = useCommonStore();
config.headers['Access-Token'] = comm.user.token;
return config;
},
(error: AxiosError) => {
console.log(error);
return Promise.reject();
}
);
service.interceptors.response.use(
(response: AxiosResponse) => {
if (response.status === 200) {
return response;
} else {
Promise.reject();
}
},
(error: AxiosError) => {
console.log(error);
return Promise.reject();
(response: AxiosResponse) => {
const { data } = response;
if (data.code !== 200) {
ElMessage.error(data.msg)
if (data.code === 1003) {
// const comm = useCommonStore();
// comm.clearStore()
// router.replace('/login');
}
return Promise.reject(data);
}
if (response.status === 200) {
return data.data;
} else {
Promise.reject(data);
}
},
(error: AxiosError) => {
console.log(error);
return Promise.reject();
}
);
export default service;

View File

@ -3,16 +3,16 @@
<div class="img"></div>
<div class="content">
<div class="content-title">欢迎来到智能手铐管理系统</div>
<el-form :model="form" label-position="top" label-width="auto" style="max-width: 600px">
<el-form-item label="账号">
<el-input v-model="form.acc" class="input" placeholder="请输入账号" size="large" clearable />
<el-form :model="ruleForm" :rules="rules" ref="ruleFormRef" label-position="top" label-width="auto" style="max-width: 600px">
<el-form-item label="账号" prop="username">
<el-input v-model="ruleForm.username" class="input" placeholder="请输入账号" size="large" clearable />
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.pwd" type="password" class="input" placeholder="请输入密码" size="large" clearable />
<el-form-item label="密码" prop="password">
<el-input v-model="ruleForm.password" type="password" class="input" placeholder="请输入密码" size="large" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" class="btn" size="large"> </el-button>
<el-button type="primary" @click="submitForm(ruleFormRef)" class="btn" size="large"> </el-button>
</el-form-item>
<div class="hint">
如遇到账号问题请联系管理员<br />
@ -24,19 +24,52 @@
</template>
<script setup lang="ts">
import { reactive } from "vue";
import { reactive, ref } from "vue";
import { useRouter } from "vue-router";
import { fetchLogin } from "@/api/index";
import { useCommonStore } from "@/store/common";
import type { FormInstance, FormRules } from "element-plus";
import { ElMessage } from "element-plus";
const router = useRouter();
const comm = useCommonStore();
const ruleFormRef = ref<FormInstance>();
// do not use same name with ref
const form = reactive({
acc: "",
pwd: "",
const validatePass = (rule: any, value: any, callback: any) => {
if (rule.field == "username" && !ruleForm.username) return callback(new Error("请输入账号"));
if (rule.field == "password" && !ruleForm.password) return callback(new Error("请输入密码"));
callback();
};
const ruleForm = reactive({
username: "",
password: "",
});
const onSubmit = () => {
// console.log("submit!");
router.push("statisticalCenter");
const rules = reactive<FormRules<typeof ruleForm>>({
username: [{ validator: validatePass, trigger: "blur" }],
password: [{ validator: validatePass, trigger: "blur" }],
});
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
fetchLogin(ruleForm)
.then((res) => {
comm.setUser(res);
ElMessage({
message: "登录成功",
type: "success",
});
setTimeout(() => {
router.push("/");
}, 1000);
})
.catch((err) => {
console.log(err, "err");
});
}
});
};
</script>

View File

@ -6,22 +6,22 @@
</template>
<el-row :gutter="20">
<el-col :span="6">
<div class="item"><span>手铐序号</span>手铐-10</div>
<div class="item"><span>绑定管理员</span>欧尼蒋</div>
<div class="item"><span>现在状态</span>禁用</div>
<div class="item"><span>手铐序号</span>{{ query.id }}</div>
<div class="item"><span>绑定管理员</span>{{ query.name }}</div>
<div class="item"><span>设备状态</span>{{ statusEnum[query.status as string] }}</div>
</el-col>
<el-col :span="6">
<div class="item"><span>IMEI号</span>860116079430636</div>
<div class="item"><span>关联人信息</span>警察123456</div>
<div class="item"><span>当前电量</span>87%</div>
<div class="item"><span>IMEI号</span>{{ query.deviceId }}</div>
<div class="item"><span>绑定管理者账号</span>{{ query.username }}</div>
<div class="item"><span>当前电量</span>{{ query.battery }}%</div>
</el-col>
<el-col :span="6">
<div class="item"><span>首次绑定时间</span>2025/03/26 18:33:32</div>
<div class="item"><span>隶属组织</span>xxx公安局</div>
<div class="item"><span>联系电话</span>10000000000</div>
<div class="item"><span>首次绑定时间</span>{{ query.createTime }}</div>
<div class="item"><span>隶属组织</span>{{ query.orgName }}</div>
<div class="item"><span>联系电话</span>{{ query.phone }}</div>
</el-col>
<el-col :span="6">
<div class="item"><span>固件版本</span>V 3.14</div>
<div class="item"><span>固件版本</span>{{ query.deviceVersion }}</div>
</el-col>
</el-row>
</el-card>
@ -29,9 +29,9 @@
<template #header>
<div class="card-header">使用记录</div>
</template>
<TableCustom :columns="record" :tableData="tableData" :total="page.total" :currentPage="page.index" :changePage="changePage">
<template #operator>
<el-button link type="primary" size="small"> 处理事件 </el-button>
<TableCustom :hasToolbar="false" :columns="record" :tableData="tableData" :total="paging.total" :currentPage="paging.page" :changePage="changePage">
<template #status="{ rows }">
{{ recordStatusEnum[rows.status] }}
</template>
</TableCustom>
</el-card>
@ -39,15 +39,19 @@
<template #header>
<div class="card-header">当前设备告警记录</div>
</template>
<TableCustom :columns="columns" :tableData="tableData" :total="page.total" :currentPage="page.index" :changePage="changePage">
<TableCustom
:hasToolbar="false"
:columns="columns"
:tableData="warningTableData"
:total="paging1.total"
:currentPage="paging1.page"
:changePage="changeWarningPage"
>
<template #operator>
<el-button link type="primary" size="small"> 处理事件 </el-button>
</template>
<template #thumb>
<el-button type="success" link> </el-button>
</template>
<template #state>
<el-tag type="success"> 已处理 </el-tag>
<template #status="{ rows }">
{{ warningStatusEnum[rows.status] }}
</template>
</TableCustom>
</el-card>
@ -56,51 +60,80 @@
<script setup lang="ts" name="basetable">
import { ref, reactive } from "vue";
import { fetchData } from "@/api/index";
import { deviceUseRecord, warningRecord } from "@/api/index";
import TableCustom from "@/components/table-custom.vue";
import { TableItem } from "@/types/table";
import { useRouter } from "vue-router";
import { useRouter, useRoute } from "vue-router";
import { TDevice } from "@/api/index.d";
const router = useRouter();
const { query } = useRoute();
enum statusEnum {
"使用中" = 0,
"在线",
"充电中",
}
enum warningStatusEnum {
"待处理",
"已处理",
}
enum recordStatusEnum {
"使用中" = 1,
"结束使用",
}
//
let record = ref([
{ type: "index", label: "序号", width: 55, align: "center" },
{ prop: "name", label: "关联人" },
{ prop: "money", label: "类型" },
{ prop: "thumb", label: "警号" },
{ prop: "state", label: "佩戴者" },
{ prop: "state", label: "使用模式" },
{ prop: "state", label: "开始使用时间" },
{ prop: "state", label: "结束使用时间" },
{ prop: "adminName", label: "管理员" },
{ prop: "userNumber", label: "佩戴者" },
{ prop: "createTime", label: "开始使用时间" },
{ prop: "updateTime", label: "结束使用时间" },
]);
//
let columns = ref([
{ type: "index", label: "序号", width: 55, align: "center" },
{ prop: "name", label: "关联人" },
{ prop: "money", label: "事件类型" },
{ prop: "thumb", label: "事件等级" },
{ prop: "time", label: "触发时间" },
{ prop: "state", label: "处理状态" },
{ prop: "userNumber", label: "佩戴者" },
{ prop: "warnType", label: "事件类型" },
{ prop: "creatUser", label: "触发时间" },
{ prop: "status", label: "处理状态" },
{ prop: "operator", label: "操作" },
]);
const page = reactive({
index: 1,
const paging = reactive({
page: 1,
size: 10,
total: 200,
total: 0,
});
const tableData = ref<TableItem[]>([]);
const paging1 = reactive({
page: 1,
size: 10,
total: 0,
});
const tableData = ref<TDevice.IUseRecordRes[]>([]);
const warningTableData = ref<TDevice.IWarningRecordRes[]>([]);
const getData = async () => {
const res = await fetchData();
tableData.value = res.data.list;
const res = await deviceUseRecord(paging);
tableData.value = res.records;
paging.total = res.total;
};
const getWarningData = async () => {
const res = await warningRecord(paging1);
warningTableData.value = res.records;
paging1.total = res.total;
};
getData();
getWarningData();
const changePage = (val: number) => {
page.index = val;
paging.page = val;
getData();
};
const changeWarningPage = (val: number) => {
paging1.page = val;
getWarningData();
};
</script>
<style scoped lang="less">

View File

@ -0,0 +1,80 @@
<template>
<el-form label-width="auto">
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="8">
<el-form-item label="关机:">
<el-button type="primary" @click="handelControl(1)">关机</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="重启:">
<el-button type="primary" @click="handelControl(2)">重启</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="8">
<el-form-item label="恢复出厂:">
<el-button type="primary" @click="handelControl(3)">恢复出厂</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="获取实时定位:">
<el-button type="primary" @click="handelControl(4)">获取实时定位</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="模式选择:">
<el-select placeholder="请选择模式" v-model="modelValue.monitorMode" style="width: 240px" @change="handelControl(5)">
<el-option label="审讯模式" :value="0" />
<el-option label="户外押送" :value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="定位模式:">
<el-select placeholder="请选择定位模式" v-model="modelValue.mode" style="width: 240px" @change="handelControl(6)">
<el-option label="室内" :value="0" />
<el-option label="室外" :value="1" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup lang="ts" name="basetable">
import { ElMessageBox } from "element-plus";
const emit = defineEmits(["change"]);
const { modelValue } = defineProps({
modelValue: {
type: Object,
default: () => ({}),
},
});
const handelControl = (type: number) => {
if (type <= 4) {
enum msgEnum {
"确定要关机吗?" = 1,
"确定要重启吗?",
"确定要恢复出厂吗?",
"确定要获取实时定位吗?",
}
ElMessageBox.confirm(msgEnum[type], "提示", {
type: "warning",
}).then(async () => {
emit("change", type);
});
} else {
emit("change", type);
}
};
// const model = useVModel(props, "modelValue", emit);
</script>

View File

@ -2,25 +2,33 @@
<div class="container">
<TableSearch :query="query" :options="searchOpt" :search="handleSearch" />
<div class="table-container">
<TableCustom :columns="columns" :tableData="tableData" :total="page.total" :refresh="getData" :currentPage="page.index" :changePage="changePage">
<TableCustom :columns="columns" :tableData="tableData" :total="paging.total" :refresh="getData" :currentPage="paging.page" :changePage="changePage">
<template #toolbarBtn>
<!-- <el-button type="primary" @click="handleAdd">新增</el-button> -->
<el-button @click="handleEdit">手铐关联</el-button>
<!-- <el-button>地图位置</el-button> -->
<!-- <el-button>导出</el-button> -->
</template>
<template #money="{ rows }"> {{ rows.money }} </template>
<template #thumb="{ rows }">
<el-image class="table-td-thumb" :src="rows.thumb" :z-index="10" :preview-src-list="[rows.thumb]" preview-teleported> </el-image>
</template>
<template #state="{ rows }">
<el-switch />
{{ stateEnum[rows.state] }}
</template>
<template #deviceSwitch="{ rows }">
{{ deviceSwitchEnum[rows.deviceSwitch] }}
</template>
<template #mode="{ rows }">
{{ modeEnum[rows.mode] }}
</template>
<template #monitorMode="{ rows }">
{{ monitorModeEnum[rows.monitorMode] }}
</template>
<template #battery="{ rows }"> {{ rows.battery }}% </template>
<template #operator="{ rows }">
<el-button link type="primary" size="small" @click="router.push('deviceInfo')"> 详细信息 </el-button>
<el-button link type="primary" size="small" @click="router.push('mapLocation')"> 地图位置 </el-button>
<el-button link type="primary" size="small" @click="router.push('setting')"> 专项配置 </el-button>
<el-button link type="primary" size="small" @click="visible1 = true"> 设备控制 </el-button>
<el-button link type="primary" size="small" @click="toPage('deviceInfo', rows)"> 详细信息 </el-button>
<el-button link type="primary" size="small" @click="toPage('mapLocation', rows)"> 地图位置 </el-button>
<el-button link type="primary" size="small" @click="toPage('setting', rows)"> 专项配置 </el-button>
<el-button link type="primary" size="small" @click="handelRow(rows)"> 设备控制 </el-button>
<el-button link type="primary" size="small" @click="handleEdit(rows)"> 修改 </el-button>
<!-- <el-button link type="danger" size="small" @click="handelDel(rows)"> 删除 </el-button> -->
</template>
@ -29,54 +37,10 @@
<el-dialog :title="isEdit ? '编辑' : '新增'" v-model="visible" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<TableEdit :form-data="rowData" :options="TableEditOptions" :edit="isEdit" :update="updateData" @close="closeDialog" />
</el-dialog>
<el-dialog title="设备控制" v-model="visible1" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<!-- <TableEdit :form-data="rowData" :options="controlOptions" :update="updateData" /> -->
<el-form label-width="auto">
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="8">
<el-form-item label="关机:">
<el-button type="primary" @click="handelControl(1)">关机</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="重启:">
<el-button type="primary" @click="handelControl(2)">重启</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="8">
<el-form-item label="获取实时定位:">
<el-button type="primary" @click="handelControl(2)">获取实时定位</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="恢复出厂:">
<el-button type="primary" @click="handelControl(3)">恢复出厂</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="模式选择:">
<el-select placeholder="请选择模式" v-model="controlForm.pattern" style="width: 240px" @change="handelControl(4)">
<el-option label="审讯模式" :value="1" />
<el-option label="户外押送" :value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="定位模式:">
<el-select placeholder="请选择定位模式" v-model="controlForm.location" style="width: 240px" @change="handelControl(5)">
<el-option label="室内" :value="1" />
<el-option label="室外" :value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<DeviceControl v-model="controlForm" @change="handelControl" />
</el-dialog>
</div>
</template>
@ -84,13 +48,33 @@
<script setup lang="ts" name="basetable">
import { ref, reactive } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { fetchData } from "@/api/index";
import { deviceList, setMode, deviceGetLocation, deviceControl } from "@/api/index";
import { TDevice } from "@/api/index.d";
import TableCustom from "@/components/table-custom.vue";
import TableSearch from "@/components/table-search.vue";
import TableEdit from "@/components/table-edit.vue";
import DeviceControl from "./deviceControl.vue";
import { TableItem } from "@/types/table";
import { FormOption, FormOptionList } from "@/types/form-option";
import { useRouter } from "vue-router";
enum stateEnum {
"离线" = 0,
"在线",
"充电中",
}
enum deviceSwitchEnum {
"禁用" = 0,
"启用",
}
enum modeEnum {
"室内" = 0,
"室外",
}
enum monitorModeEnum {
"室内" = 0,
"室外",
}
const router = useRouter();
// /
let TableEditOptions = ref<FormOption>({
@ -122,44 +106,46 @@ const handleSearch = () => {
let columns = ref([
{ type: "selection" },
{ type: "index", label: "序号", width: 55, align: "center" },
{ prop: "name", label: "手铐SN" },
{ prop: "money", label: "绑定警察名称" },
{ prop: "thumb", label: "绑定警察账户" },
{ prop: "state", label: "当前状态" },
{ prop: "state", label: "当前模式" },
{ prop: "state", label: "电量" },
{ prop: "state", label: "版本号" },
{ prop: "state", label: "登录时间" },
{ prop: "state", label: "最近使用时间" },
{ prop: "state", label: "关联辖区编号" },
{ prop: "deviceId", label: "手铐IMEI" },
{ prop: "name", label: "绑定警察名称" },
{ prop: "username", label: "绑定警察账户" },
{ prop: "state", label: "设备状态" },
{ prop: "mode", label: "当前模式" },
{ prop: "deviceSwitch", label: "开关" },
{ prop: "monitorMode", label: "监测模式" },
{ prop: "battery", label: "电量" },
{ prop: "deviceVersion", label: "版本号" },
{ prop: "createTime", label: "创建时间" },
{ prop: "orgName", label: "关联辖区编号" },
{ prop: "operator", label: "操作", width: 400 },
]);
const page = reactive({
index: 1,
const paging = reactive({
page: 1,
size: 10,
total: 200,
total: 0,
});
const controlForm = reactive({
pattern: "",
location: "",
pattern: 1,
location: 1,
});
const tableData = ref<TableItem[]>([]);
const tableData = ref<TDevice.IListRes[]>([]);
const getData = async () => {
const res = await fetchData();
tableData.value = res.data.list;
const res = await deviceList(paging);
tableData.value = res.records;
paging.total = res.total;
};
getData();
const changePage = (val: number) => {
page.index = val;
paging.page = val;
getData();
};
const visible1 = ref(false);
const visible = ref(false);
const isEdit = ref(false);
const rowData = ref({});
const rowData = ref<TDevice.IListRes>();
const handleAdd = () => {
TableEditOptions.value.list = addOp;
@ -167,22 +153,42 @@ const handleAdd = () => {
};
//
const handleEdit = (row?: TableItem) => {
// rowData.value = { ...row };
const handleEdit = (row?: TDevice.IListRes) => {
rowData.value = { ...row };
TableEditOptions.value.list = editOp;
isEdit.value = true;
visible.value = true;
};
const handelRow = (row?: TDevice.IListRes) => {
rowData.value = { ...row };
visible1.value = true;
};
const handelControl = (type: number) => {
if (type < 4) {
ElMessageBox.confirm("确定要关机吗?", "提示", {
type: "warning",
})
.then(async () => {
// ElMessage.success("");
})
.catch(() => {});
switch (type) {
case 4:
deviceGetLocation({
deviceId: rowData.value.deviceId,
}).then(() => {
ElMessage.success("操作成功");
});
break;
default:
let cmdEnum = {
1: "poweroff",
2: "restart",
3: "factory",
};
deviceControl({
deviceId: rowData.value.deviceId,
cmd: cmdEnum[type],
}).then(() => {
ElMessage.success("操作成功");
});
break;
}
visible1.value = false;
};
//
@ -210,6 +216,21 @@ const closeDialog = () => {
const handleDelete = (row: TableItem) => {
ElMessage.success("删除成功");
};
//
const toPage = (path: string, row: TDevice.IListRes) => {
let p;
if (path == "deviceInfo") {
p = { ...row };
} else if (path == "mapLocation") {
p = { id: row.id };
} else if (path == "setting") {
p = { id: row.id };
}
router.push({
path,
query: p,
});
};
</script>
<style scoped>

View File

@ -2,36 +2,44 @@
<div class="container">
<TableSearch :query="query" :options="searchOpt" :search="handleSearch" />
<div class="table-container">
<TableCustom :columns="columns" :tableData="tableData" :total="page.total" :refresh="getData" :currentPage="page.index" :changePage="changePage">
<TableCustom :columns="columns" :tableData="tableData" :total="paging.total" :refresh="getData" :currentPage="paging.page" :changePage="changePage">
<template #toolbarBtn>
<el-button type="primary" @click="typeVisible = true">类型编辑</el-button>
<el-button type="primary" @click="visible = true">新增用户</el-button>
<el-button type="primary" @click="handelRow('add')">新增用户</el-button>
<el-button @click="handleImp">批量创建用户</el-button>
<el-button>导出</el-button>
<el-button type="danger">删除</el-button>
</template>
<template #money="{ rows }"> {{ rows.money }} </template>
<template #thumb="{ rows }">
<el-image class="table-td-thumb" :src="rows.thumb" :z-index="10" :preview-src-list="[rows.thumb]" preview-teleported> </el-image>
<!-- <el-button>导出</el-button> -->
<!-- <el-button type="danger">删除</el-button> -->
</template>
<template #state="{ rows }">
<el-tag :type="rows.state ? 'success' : 'danger'">
{{ rows.state ? "正常" : "异常" }}
</el-tag>
<el-switch v-model="rows.state" :active-value="1" :inactive-value="0" />
</template>
<template #roleId="{ rows }">
{{ roleEnum[rows.roleId] }}
</template>
<template #password="{ rows }">
<div v-if="rows.flag" @click="rows.flag = false">
{{ rows.password }}
<el-icon style="cursor: pointer"><View /></el-icon>
</div>
<div v-else @click="rows.flag = true">
******
<el-icon style="cursor: pointer"><Hide /></el-icon>
</div>
</template>
<template #operator="{ rows }">
<el-button link type="primary" size="small" @click="pwdVisible = true"> 重置密码 </el-button>
<el-button link type="primary" size="small" @click="handleEdit(rows)"> 修改 </el-button>
<el-button link type="primary" size="small" @click="handelRow('pwd', rows)"> 重置密码 </el-button>
<el-button link type="primary" size="small" @click="handelRow('edit', rows)"> 修改 </el-button>
<el-button link type="danger" size="small" @click="handelDel(rows)"> 删除 </el-button>
</template>
</TableCustom>
</div>
<el-dialog :title="isEdit ? '编辑' : '新增'" v-model="visible" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<el-dialog :title="dialogTitle" v-model="visible" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<TableEdit :form-data="rowData" :options="options" :edit="isEdit" :update="updateData" @close="closeDialog" />
</el-dialog>
<el-dialog title="重置密码" v-model="pwdVisible" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<TableEdit :form-data="rowData" :options="pwdOptions" :edit="true" :update="updateData" @close="handelCancel" />
</el-dialog>
<el-dialog title="编辑类型" v-model="typeVisible" width="800px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<UserType />
</el-dialog>
@ -42,31 +50,42 @@
<script setup lang="ts" name="basetable">
import { ref, reactive } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { fetchData } from "@/api/index";
import { accountAdd, accountModify, accountList, accountDeletet, passwordReset } from "@/api/index";
import TableCustom from "@/components/table-custom.vue";
import TableSearch from "@/components/table-search.vue";
import TableEdit from "@/components/table-edit.vue";
import BatchImp from "@/components/batch-imp.vue";
import { useCommonStore } from "@/store/common";
import UserType from "./userType.vue";
import { TableItem } from "@/types/table";
import { FormOption, FormOptionList } from "@/types/form-option";
import { TAccount } from "@/api/index.d";
// import { Hide, View } from "@element-plus/icons-vue";
enum roleEnum {
管理员 = -1,
警察 = 1,
辅警 = 2,
协警 = 3,
}
const comm = useCommonStore();
const visible = ref(false);
const typeVisible = ref(false);
const pwdVisible = ref(false);
const isEdit = ref(false);
const rowData = ref({});
const dialogTitle = ref("");
const rowData = ref<TAccount.IListRes | undefined>();
//
const query = reactive({
name: "",
});
const batchImpRef = ref();
const page = reactive({
index: 1,
const paging = reactive({
page: 1,
size: 10,
total: 200,
total: 0,
});
const tableData = ref<TableItem[]>([]);
const tableData = ref<TAccount.IListRes[]>([]);
const searchOpt = ref<FormOptionList[]>([
{ type: "input", label: "用户名:", prop: "name" },
@ -95,94 +114,110 @@ const searchOpt = ref<FormOptionList[]>([
//
let columns = ref([
{ type: "selection" },
// { type: "selection" },
{ type: "index", label: "序号", width: 55, align: "center" },
{ prop: "name", label: "用户名称" },
{ prop: "money", label: "警员号" },
{ prop: "thumb", label: "手机号" },
{ prop: "state", label: "密码" },
{ prop: "state", label: "类型" },
{ prop: "state", label: "创建时间" },
{ prop: "username", label: "警员号" },
{ prop: "phone", label: "手机号" },
{ prop: "password", label: "密码", width: 120 },
{ prop: "roleId", label: "类型" },
{ prop: "createTime", label: "创建时间" },
{ prop: "state", label: "状态" },
{ prop: "operator", label: "操作", width: 250 },
]);
// /
let options = ref<FormOption>({
let addOpt = {
labelWidth: "100px",
span: 24,
list: [
{ placeholder: "请输入用户名称", type: "input", label: "用户名称", prop: "name1", required: true },
{ placeholder: "请输入电话号码", type: "input", label: "电话号码", prop: "money2", required: true },
{ placeholder: "请输入警员号", type: "input", label: "警员号", prop: "money3", required: true },
{ placeholder: "请输入用户名称", type: "input", label: "用户名称", prop: "name", required: true },
{ placeholder: "请输入电话号码", type: "input", label: "电话号码", prop: "phone", required: true },
{ placeholder: "请输入警员号", type: "input", label: "警员号", prop: "username", required: true },
{
placeholder: "请选择类型",
type: "select",
label: "类型",
opts: [
{ label: "管理员", value: "1", disabled: true },
{ label: "警察", value: "2" },
{ label: "辅警", value: "3" },
{ label: "协警", value: "4" },
{ label: "管理员", value: -1 },
{ label: "警察", value: 1 },
{ label: "辅警", value: 2 },
{ label: "协警", value: 3 },
],
prop: "money4",
prop: "roleId",
required: true,
},
{ placeholder: "请输入密码", type: "password", label: "密码", prop: "mone5y", required: true },
{ type: "switch", label: "状态", prop: "mone5y", required: true },
{ placeholder: "请输入确认密码", type: "password", label: "确认密码", prop: "mon6ey" },
{ placeholder: "请输入备注", type: "textarea", label: "备注", prop: "mon8ey" },
{ placeholder: "请输入密码", type: "password", label: "密码", prop: "password", required: true },
{ type: "switch", label: "状态", prop: "status", activeValue: 1, inactiveValue: 0 },
// { placeholder: "", type: "password", label: "", prop: "confirmpassword" },
// { placeholder: "", type: "textarea", label: "", prop: "mon8ey" },
],
});
};
// /
let pwdOptions = ref<FormOption>({
let options = ref<FormOption>();
//
let pwdOpt = {
labelWidth: "100px",
span: 24,
list: [
{ type: "password", label: "原始密码", prop: "name1", required: true },
{ type: "password", label: "新密码", prop: "money2", required: true },
{ type: "password", label: "确认密码", prop: "money3", required: true },
// { type: "password", label: "", prop: "name1", required: true },
{ type: "password", label: "新密码", prop: "password", required: true },
// { type: "password", label: "", prop: "money3", required: true },
],
});
};
const handleImp = () => {
batchImpRef.value.dialogVisible = true;
};
const handleSearch = () => {
changePage(1);
paging.page = 1;
getData();
};
const changePage = (val: number) => {
paging.page = val;
getData();
};
const getData = async () => {
const res = await fetchData();
tableData.value = res.data.list;
const res = await accountList(paging);
tableData.value = res.records.map((item) => {
item.flag = false;
return item;
});
paging.total = res.total;
};
getData();
const changePage = (val: number) => {
page.index = val;
getData();
};
//
const handelDel = (row: TableItem) => {
ElMessageBox.confirm("确定要删除吗?", "提示", {
type: "warning",
})
.then(async () => {
// ElMessage.success("");
})
.catch(() => {});
};
//
const handleEdit = (row: TableItem) => {
rowData.value = { ...row };
isEdit.value = true;
visible.value = true;
}).then(async () => {
accountDeletet({ id: row.id }).then((res) => {
ElMessage.success("删除成功");
getData();
});
});
};
const updateData = () => {
closeDialog();
getData();
const updateData = (res) => {
let api, msg, p;
if (dialogTitle.value == "重置密码") {
api = passwordReset;
p = { ...res, id: rowData.value.id };
msg = "重置成功";
} else {
p = { ...res, orgId: comm.user.orgId };
api = isEdit.value ? accountModify : accountAdd;
msg = isEdit.value ? "修改成功" : "新增成功";
}
api(p).then((res) => {
ElMessage.success(msg);
closeDialog();
getData();
});
};
const closeDialog = () => {
@ -190,9 +225,24 @@ const closeDialog = () => {
isEdit.value = false;
};
const handelCancel = () => {
rowData.value = {};
pwdVisible.value = false;
const handelRow = (name: string, row?: TAccount.IListRes) => {
if (name == "add") {
dialogTitle.value = "新增用户";
options.value = { ...addOpt };
rowData.value = undefined;
isEdit.value = false;
} else if (name == "pwd") {
dialogTitle.value = "重置密码";
options.value = { ...pwdOpt };
rowData.value = { ...row };
isEdit.value = true;
} else if (name == "edit") {
dialogTitle.value = "编辑";
isEdit.value = true;
options.value = { ...addOpt };
rowData.value = { ...row };
}
visible.value = true;
};
</script>

448
yarn.lock
View File

@ -64,6 +64,11 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/sourcemap-codec@^1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@ -85,6 +90,34 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@nuxt/kit@^3.14.1592":
version "3.16.2"
resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.16.2.tgz#9fbb2ef3bd9ebeb499b4cc5215e2f857c54b75d7"
integrity sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==
dependencies:
c12 "^3.0.2"
consola "^3.4.2"
defu "^6.1.4"
destr "^2.0.3"
errx "^0.1.0"
exsolve "^1.0.4"
globby "^14.1.0"
ignore "^7.0.3"
jiti "^2.4.2"
klona "^2.0.6"
knitwork "^1.2.0"
mlly "^1.7.4"
ohash "^2.0.11"
pathe "^2.0.3"
pkg-types "^2.1.0"
scule "^1.3.0"
semver "^7.7.1"
std-env "^3.8.1"
ufo "^1.5.4"
unctx "^2.4.1"
unimport "^4.1.3"
untyped "^2.0.0"
"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
version "2.11.7"
resolved "https://registry.yarnpkg.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671"
@ -99,6 +132,11 @@
estree-walker "^2.0.2"
picomatch "^2.3.1"
"@sindresorhus/merge-streams@^2.1.0":
version "2.3.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958"
integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==
"@transloadit/prettier-bytes@0.0.7":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b"
@ -402,6 +440,11 @@ acorn@^8.10.0, acorn@^8.11.3:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
acorn@^8.14.0, acorn@^8.14.1:
version "8.14.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb"
integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==
adler-32@~1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
@ -463,6 +506,31 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
braces@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.1.1"
c12@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/c12/-/c12-3.0.2.tgz#5ceba55cf081ff4cf95b22c593c80b34cf1f3d2e"
integrity sha512-6Tzk1/TNeI3WBPpK0j/Ss4+gPj3PUJYbWl/MWDJBThFvwNGNkXtd7Cz8BJtD4aRwoGHtzQD0SnxamgUiBH0/Nw==
dependencies:
chokidar "^4.0.3"
confbox "^0.1.8"
defu "^6.1.4"
dotenv "^16.4.7"
exsolve "^1.0.0"
giget "^2.0.0"
jiti "^2.4.2"
ohash "^2.0.5"
pathe "^2.0.3"
perfect-debounce "^1.0.0"
pkg-types "^2.0.0"
rc9 "^2.1.2"
cfb@~1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
@ -486,6 +554,20 @@ chokidar@^3.5.3, chokidar@^3.6.0:
optionalDependencies:
fsevents "~2.3.2"
chokidar@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
dependencies:
readdirp "^4.0.1"
citty@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4"
integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==
dependencies:
consola "^3.2.3"
clone@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
@ -508,6 +590,21 @@ compute-scroll-into-view@^1.0.20:
resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43"
integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==
confbox@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06"
integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
confbox@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.1.tgz#ae39f2c99699afa451d00206479f15f9a1208a8b"
integrity sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==
consola@^3.2.3, consola@^3.4.0, consola@^3.4.2:
version "3.4.2"
resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7"
integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==
copy-anything@^2.0.1:
version "2.0.6"
resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
@ -555,11 +652,26 @@ debug@^4.3.4:
dependencies:
ms "2.1.2"
deep-pick-omit@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz#c035b27a4c86518b76f60ffa3004e6c61f317032"
integrity sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==
defu@^6.1.4:
version "6.1.4"
resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479"
integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
destr@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449"
integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==
dom7@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
@ -567,6 +679,11 @@ dom7@^3.0.0:
dependencies:
ssr-window "^3.0.0-alpha.1"
dotenv@^16.4.7:
version "16.4.7"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
echarts-wordcloud@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/echarts-wordcloud/-/echarts-wordcloud-2.1.0.tgz#c3de6fe267044f6c3343e4ff0e05eedb01c05096"
@ -618,6 +735,11 @@ errno@^0.1.1:
dependencies:
prr "~1.0.1"
errx@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/errx/-/errx-0.1.0.tgz#4881e411d90a3b1e1620a07604f50081dd59f3aa"
integrity sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==
es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14:
version "0.10.64"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
@ -798,6 +920,13 @@ estree-walker@^2.0.2:
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
estree-walker@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d"
integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==
dependencies:
"@types/estree" "^1.0.0"
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
@ -806,6 +935,11 @@ event-emitter@^0.3.5:
d "1"
es5-ext "~0.10.14"
exsolve@^1.0.0, exsolve@^1.0.1, exsolve@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.4.tgz#7de5c75af82ecd15998328fbf5f2295883be3a39"
integrity sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==
ext@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
@ -824,6 +958,17 @@ fast-glob@^3.2.12:
merge2 "^1.3.0"
micromatch "^4.0.4"
fast-glob@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
dependencies:
"@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"
fastq@^1.6.0:
version "1.17.1"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
@ -831,6 +976,11 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
fdir@^6.4.3:
version "6.4.3"
resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72"
integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@ -838,6 +988,13 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
dependencies:
to-regex-range "^5.0.1"
follow-redirects@^1.15.6:
version "1.15.6"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
@ -867,6 +1024,18 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
giget@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/giget/-/giget-2.0.0.tgz#395fc934a43f9a7a29a29d55b99f23e30c14f195"
integrity sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==
dependencies:
citty "^0.1.6"
consola "^3.4.0"
defu "^6.1.4"
node-fetch-native "^1.6.6"
nypm "^0.6.0"
pathe "^2.0.3"
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@ -874,6 +1043,18 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
globby@^14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-14.1.0.tgz#138b78e77cf5a8d794e327b15dce80bf1fb0a73e"
integrity sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==
dependencies:
"@sindresorhus/merge-streams" "^2.1.0"
fast-glob "^3.3.3"
ignore "^7.0.3"
path-type "^6.0.0"
slash "^5.1.0"
unicorn-magic "^0.3.0"
graceful-fs@^4.1.2:
version "4.2.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
@ -898,6 +1079,11 @@ i18next@^20.4.0:
dependencies:
"@babel/runtime" "^7.12.0"
ignore@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733"
integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==
image-size@~0.5.0:
version "0.5.5"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
@ -959,6 +1145,16 @@ is-what@^3.14.1:
resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
jiti@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560"
integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
js-tokens@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4"
integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==
json5@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
@ -971,6 +1167,16 @@ jsonc-parser@^3.2.0:
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a"
integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==
klona@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22"
integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==
knitwork@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/knitwork/-/knitwork-1.2.0.tgz#3cc92e76249aeb35449cfbed3f31c6df8444db3f"
integrity sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==
less-loader@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466"
@ -1010,6 +1216,15 @@ local-pkg@^0.4.2, local-pkg@^0.4.3:
resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963"
integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==
local-pkg@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.1.1.tgz#f5fe74a97a3bd3c165788ee08ca9fbe998dc58dd"
integrity sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==
dependencies:
mlly "^1.7.4"
pkg-types "^2.0.1"
quansync "^0.2.8"
lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
@ -1081,6 +1296,13 @@ magic-string@^0.27.0:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.13"
magic-string@^0.30.17:
version "0.30.17"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.0"
magic-string@^0.30.7:
version "0.30.9"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d"
@ -1119,6 +1341,14 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
micromatch@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
dependencies:
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@ -1165,6 +1395,16 @@ mlly@^1.1.0, mlly@^1.2.0:
pkg-types "^1.0.3"
ufo "^1.3.2"
mlly@^1.7.4:
version "1.7.4"
resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f"
integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==
dependencies:
acorn "^8.14.0"
pathe "^2.0.1"
pkg-types "^1.3.0"
ufo "^1.5.4"
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@ -1190,6 +1430,11 @@ next-tick@^1.1.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
node-fetch-native@^1.6.6:
version "1.6.6"
resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz#ae1d0e537af35c2c0b0de81cbff37eedd410aa37"
integrity sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@ -1205,16 +1450,47 @@ nprogress@^0.2.0:
resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==
nypm@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.6.0.tgz#3a04623d1c358a93fc4b3cb9cfb6a11af080feca"
integrity sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==
dependencies:
citty "^0.1.6"
consola "^3.4.0"
pathe "^2.0.3"
pkg-types "^2.0.0"
tinyexec "^0.3.2"
ohash@^2.0.11, ohash@^2.0.5:
version "2.0.11"
resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b"
integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-type@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-6.0.0.tgz#2f1bb6791a91ce99194caede5d6c5920ed81eb51"
integrity sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==
pathe@^1.0.0, pathe@^1.1.0, pathe@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec"
integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
pathe@^2.0.1, pathe@^2.0.2, pathe@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716"
integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
perfect-debounce@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@ -1225,11 +1501,33 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
picomatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
pify@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pinia-plugin-persist@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz#fc696f225527f30bd5955109fafadd43c725e888"
integrity sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==
dependencies:
vue-demi "^0.12.1"
pinia-plugin-persistedstate@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz#31973291b768bd84ce24e55083e7171b2f451ad1"
integrity sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==
dependencies:
"@nuxt/kit" "^3.14.1592"
deep-pick-omit "^1.2.1"
defu "^6.1.4"
destr "^2.0.3"
pinia@^2.1.7:
version "2.1.7"
resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.1.7.tgz#4cf5420d9324ca00b7b4984d3fbf693222115bbc"
@ -1247,6 +1545,24 @@ pkg-types@^1.0.1, pkg-types@^1.0.3:
mlly "^1.2.0"
pathe "^1.1.0"
pkg-types@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df"
integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==
dependencies:
confbox "^0.1.8"
mlly "^1.7.4"
pathe "^2.0.1"
pkg-types@^2.0.0, pkg-types@^2.0.1, pkg-types@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.1.0.tgz#70c9e1b9c74b63fdde749876ee0aa007ea9edead"
integrity sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==
dependencies:
confbox "^0.2.1"
exsolve "^1.0.1"
pathe "^2.0.3"
postcss@^8.4.18, postcss@^8.4.35:
version "8.4.38"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
@ -1276,11 +1592,29 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
quansync@^0.2.8:
version "0.2.10"
resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1"
integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
rc9@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d"
integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==
dependencies:
defu "^6.1.4"
destr "^2.0.3"
readdirp@^4.0.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@ -1338,7 +1672,7 @@ scroll-into-view-if-needed@^2.2.28:
dependencies:
compute-scroll-into-view "^1.0.20"
scule@^1.0.0:
scule@^1.0.0, scule@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/scule/-/scule-1.3.0.tgz#6efbd22fd0bb801bdcc585c89266a7d2daa8fbd3"
integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
@ -1348,6 +1682,16 @@ semver@^5.6.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^7.7.1:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
slash@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
slate-history@^0.66.0:
version "0.66.0"
resolved "https://registry.yarnpkg.com/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940"
@ -1396,6 +1740,11 @@ ssr-window@^3.0.0-alpha.1:
resolved "https://registry.yarnpkg.com/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
std-env@^3.8.1:
version "3.8.1"
resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.8.1.tgz#2b81c631c62e3d0b964b87f099b8dcab6c9a5346"
integrity sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==
strip-literal@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07"
@ -1403,6 +1752,13 @@ strip-literal@^1.0.0:
dependencies:
acorn "^8.10.0"
strip-literal@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc"
integrity sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==
dependencies:
js-tokens "^9.0.1"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
@ -1413,6 +1769,19 @@ tiny-warning@^1.0.3:
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
tinyexec@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2"
integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==
tinyglobby@^0.2.12:
version "0.2.12"
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.12.tgz#ac941a42e0c5773bd0b5d08f32de82e74a1a61b5"
integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==
dependencies:
fdir "^6.4.3"
picomatch "^4.0.2"
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@ -1445,6 +1814,26 @@ ufo@^1.3.2:
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344"
integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==
ufo@^1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754"
integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==
unctx@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/unctx/-/unctx-2.4.1.tgz#93346a98d4a38c64cc5861f6098f4ce7c6f8164a"
integrity sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==
dependencies:
acorn "^8.14.0"
estree-walker "^3.0.3"
magic-string "^0.30.17"
unplugin "^2.1.0"
unicorn-magic@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104"
integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==
unimport@^1.0.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/unimport/-/unimport-1.3.0.tgz#167ab78e60ea0e36a9a764c7b608ee95d7b2411c"
@ -1462,6 +1851,26 @@ unimport@^1.0.1:
strip-literal "^1.0.0"
unplugin "^1.0.1"
unimport@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/unimport/-/unimport-4.1.3.tgz#938f37f90faa6f29dd156ded98f1990bd5acee50"
integrity sha512-H+IVJ7rAkE3b+oC8rSJ2FsPaVsweeMC8eKZc+C6Mz7+hxDF45AnrY/tVCNRBvzMwWNcJEV67WdAVcal27iMjOw==
dependencies:
acorn "^8.14.1"
escape-string-regexp "^5.0.0"
estree-walker "^3.0.3"
local-pkg "^1.1.1"
magic-string "^0.30.17"
mlly "^1.7.4"
pathe "^2.0.3"
picomatch "^4.0.2"
pkg-types "^2.1.0"
scule "^1.3.0"
strip-literal "^3.0.0"
tinyglobby "^0.2.12"
unplugin "^2.2.2"
unplugin-utils "^0.2.4"
unplugin-auto-import@^0.11.2:
version "0.11.5"
resolved "https://registry.yarnpkg.com/unplugin-auto-import/-/unplugin-auto-import-0.11.5.tgz#84c27e5f230bc1fc9004c162a39b81fcf89da740"
@ -1474,6 +1883,14 @@ unplugin-auto-import@^0.11.2:
unimport "^1.0.1"
unplugin "^1.0.0"
unplugin-utils@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz#56e4029a6906645a10644f8befc404b06d5d24d0"
integrity sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==
dependencies:
pathe "^2.0.2"
picomatch "^4.0.2"
unplugin-vue-components@^0.22.4:
version "0.22.12"
resolved "https://registry.yarnpkg.com/unplugin-vue-components/-/unplugin-vue-components-0.22.12.tgz#39013f77be72d32df9d6ca1599e592a484015612"
@ -1500,6 +1917,25 @@ unplugin@^1.0.0, unplugin@^1.0.1:
webpack-sources "^3.2.3"
webpack-virtual-modules "^0.6.1"
unplugin@^2.1.0, unplugin@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-2.2.2.tgz#82f8c638ba944f6135e99ae5a8dc9eba9601b4a8"
integrity sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==
dependencies:
acorn "^8.14.1"
webpack-virtual-modules "^0.6.2"
untyped@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/untyped/-/untyped-2.0.0.tgz#86bc205a4ec4b0137282285866b8278557aeee97"
integrity sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==
dependencies:
citty "^0.1.6"
defu "^6.1.4"
jiti "^2.4.2"
knitwork "^1.2.0"
scule "^1.3.0"
vite-plugin-vue-setup-extend@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz#ebbbe265320039b8c6a3b9fcae3b8d152ecf4a13"
@ -1530,6 +1966,11 @@ vue-demi@*, vue-demi@>=0.14.5:
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2"
integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==
vue-demi@^0.12.1:
version "0.12.5"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.12.5.tgz#8eeed566a7d86eb090209a11723f887d28aeb2d1"
integrity sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==
vue-demi@^0.13.11:
version "0.13.11"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99"
@ -1585,6 +2026,11 @@ webpack-virtual-modules@^0.6.1:
resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz#ac6fdb9c5adb8caecd82ec241c9631b7a3681b6f"
integrity sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==
webpack-virtual-modules@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8"
integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
wildcard@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"