From b951e34206c9db13a45944bd5419f1d167fe4ceb Mon Sep 17 00:00:00 2001 From: callmeyan Date: Mon, 27 Feb 2023 19:18:58 +0800 Subject: [PATCH] initial commit --- .gitignore | 24 + config.ts | 24 + index.html | 13 + mocks/api.mock.ts | 84 ++ package.json | 30 + public/vite.svg | 18 + src/App.tsx | 226 +++++ src/assets/icon-empty.png | Bin 0 -> 2568 bytes src/assets/util.less | 0 src/components/Button/btn.less | 44 + src/components/Button/index.tsx | 32 + src/components/Checkbox.tsx | 20 + src/components/Login.tsx | 131 +++ src/components/icons/IconCheck.tsx | 17 + src/components/icons/IconClose.tsx | 21 + src/components/icons/IconCopy.tsx | 16 + src/components/icons/IconEmpty.tsx | 12 + src/components/icons/IconLoading.tsx | 18 + src/components/login.less | 106 ++ src/components/vip/index.tsx | 112 +++ src/components/vip/vip.less | 151 +++ src/components/vip/vip_bg.png | Bin 0 -> 41709 bytes src/index.less | 312 ++++++ src/main.tsx | 10 + src/services/api.ts | 27 + src/services/request.ts | 70 ++ src/utils/classnames.ts | 40 + src/utils/numbers.ts | 4 + src/utils/pxTransform.ts | 27 + src/utils/strings.ts | 16 + src/utils/useOnClickOutside.ts | 15 + src/vite-env.d.ts | 22 + tsconfig.json | 31 + tsconfig.node.json | 9 + vite.config.ts | 30 + yarn.lock | 1387 ++++++++++++++++++++++++++ 36 files changed, 3099 insertions(+) create mode 100644 .gitignore create mode 100644 config.ts create mode 100644 index.html create mode 100644 mocks/api.mock.ts create mode 100644 package.json create mode 100644 public/vite.svg create mode 100644 src/App.tsx create mode 100644 src/assets/icon-empty.png create mode 100644 src/assets/util.less create mode 100644 src/components/Button/btn.less create mode 100644 src/components/Button/index.tsx create mode 100644 src/components/Checkbox.tsx create mode 100644 src/components/Login.tsx create mode 100644 src/components/icons/IconCheck.tsx create mode 100644 src/components/icons/IconClose.tsx create mode 100644 src/components/icons/IconCopy.tsx create mode 100644 src/components/icons/IconEmpty.tsx create mode 100644 src/components/icons/IconLoading.tsx create mode 100644 src/components/login.less create mode 100644 src/components/vip/index.tsx create mode 100644 src/components/vip/vip.less create mode 100644 src/components/vip/vip_bg.png create mode 100644 src/index.less create mode 100644 src/main.tsx create mode 100644 src/services/api.ts create mode 100644 src/services/request.ts create mode 100644 src/utils/classnames.ts create mode 100644 src/utils/numbers.ts create mode 100644 src/utils/pxTransform.ts create mode 100644 src/utils/strings.ts create mode 100644 src/utils/useOnClickOutside.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/config.ts b/config.ts new file mode 100644 index 0000000..43b7073 --- /dev/null +++ b/config.ts @@ -0,0 +1,24 @@ +const AppConfig = { + development: { + CLIENT_ID: 'uziRFTVYkcgnGjAx', + SECRET: '5CsvgvJpVwKuDfff0PPTSN2mOzDFy09v', + API_PREFIX: 'http://chat.wx.wm-app.xyz', + DEPLOY_DIR: '/', + PUBLIC_PATH: '/', + }, + test: { + CLIENT_ID: 'uziRFTVYkcgnGjAx', + SECRET: '5CsvgvJpVwKuDfff0PPTSN2mOzDFy09v', + API_PREFIX: 'http://chat.wx.wm-app.xyz', + DEPLOY_DIR: (process.env.DEPLOY_DIR || '/'), + PUBLIC_PATH: (process.env.PUBLIC_PATH || './'), + }, + production: { + CLIENT_ID: 'aVjsh87iWEuhZdWC', + SECRET: 'Q3L8Npkloyucq1o8tmLYDllCt2bwZ881', + API_PREFIX: 'http://chat.wx.wm-app.xyz', + DEPLOY_DIR: (process.env.DEPLOY_DIR || '/'), + PUBLIC_PATH: (process.env.PUBLIC_PATH || './'), + } +} +export default AppConfig diff --git a/index.html b/index.html new file mode 100644 index 0000000..ee84bec --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + 星图Chat + + +
+ + + diff --git a/mocks/api.mock.ts b/mocks/api.mock.ts new file mode 100644 index 0000000..d68a173 --- /dev/null +++ b/mocks/api.mock.ts @@ -0,0 +1,84 @@ +import {MockMethod} from "vite-plugin-mock"; +import {Random} from "mockjs"; + +type UserModel = { + username: string; + account: string; + avatar: string; + vip: number; +} +type LoginUserModel = { + token: string; +} & UserModel + +const loginUserList: LoginUserModel[] = [ + { + token: "123123123123", + username: '张三', + account: '123123', + avatar: 'https://www.cdnjson.com/images/2023/01/31/qwrgFf.jpg', + vip: Date.now() + 3600 * 24 * 30 + }, + { + token: "asd2314asdf12", + username: '李四', + account: 'admin', + avatar: 'https://www.cdnjson.com/images/2023/01/31/qwrgFf.jpg', + vip: 0 + } +] +const codeSessions: any = {}; + +function success(data: any = null) { + return {code: 0, message: 'success', data} +} + +function fail(message: string, data: any = null) { + return {code: 1, message, data} +} + +const apiMock: MockMethod[] = [ + { + url: '/api/user/login', + method: 'post', + timeout: 300, + response: ({body}: { body: { phone: string, code: string } }) => { + const {phone, code} = body + if (!code || !codeSessions[phone] || (codeSessions[phone] != code && code != '123')) { + return fail('验证码不正确') + } + const user = loginUserList.filter(s => s.account === phone) + return user ? success(user) : fail('用户不存在'); + } + }, + { + url: '/api/user/info', + response: ({body}: { body: { phone: string, code: string } }) => { + console.log(body) + return success(loginUserList[0]) + } + }, + { + url: '/api/sendCode', + method: 'post', + timeout: 1500, + response: ({body}: { body: { phone: string } }) => { + const code = codeSessions[body.phone] = String(Random.natural(100000, 999999)); + return success(code); + // return fail('短信发送网关异常', body) + } + }, + { + url: '/api/chat', + method: 'post', + timeout: 200, + response: ({body}: { body: { message: string } }) => { + if (!body.message) { + return fail('消息不能为空') + } + return success({body, content: Random.cparagraph()}); + } + } +] + +export default apiMock \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..637f194 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "chat", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --host", + "build-test": "tsc && vite --mode test build", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "ahooks": "^3.7.4", + "axios": "^1.3.4", + "less": "^4.1.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "socket.io-client": "^4.6.1" + }, + "devDependencies": { + "@types/node": "^18.14.1", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "mockjs": "^1.1.0", + "typescript": "^4.9.3", + "vite": "^4.1.0", + "vite-plugin-mock": "^2.9.6" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..6447244 --- /dev/null +++ b/public/vite.svg @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..c33d9dd --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,226 @@ +import React, {useEffect, useState} from 'react' +import Login from "./components/Login"; +import {useSetState} from "ahooks"; +import {info, UserModel} from "./services/api"; +import Vip from "./components/vip"; +import Button from "./components/Button"; +import {io} from 'socket.io-client' + + +type MessageItem = { + id: number; + from: 'ai' | 'you'; + time: number; + content: string[]; + avatar: string; +} + +const avatar = 'https://www.cdnjson.com/images/2023/01/31/qwrgFf.jpg', + avatar1 = 'https://www.cdnjson.com/images/2023/02/25/AI.png', + globalMessageList: MessageItem[] = [ + {id: 1, from: 'you', time: 1, content: ['你好'], avatar}, + {id: 2, from: 'ai', time: 2, content: ['你好!有什么我能帮助你的吗?'], avatar: avatar1}, + {id: 3, from: 'you', time: 3, content: ['今天新闻'], avatar}, + { + id: 4, + from: 'ai', + time: 4, + content: ['很抱歉,我不会自己收集或浏览最新的新闻报道,因为我是一个人工智能语言模型,我的知识是基于我被训练的时间截止到2023年1月的。但是,您可以尝试搜索各大新闻网站来了解最新的新闻,例如CNN、BBC、纽约时报等等。'], + avatar: avatar1 + }, + ], + socket = io(APP_CONFIG.API_PREFIX, { + autoConnect: false + }) +let messageIndex = 5, lastMessage = 0, initSocket = false; + + +function App() { + const [count, setCount] = useState(3) + const [state, setState] = useSetState<{ + showLogin?: boolean + user?: UserModel + showVip?: boolean + message?: string + sending?: boolean + }>({ + showVip: false, + }) + + const [messageList, setMessageList] = useState(globalMessageList) + + function logout() { + //TODO 调用注销登录接口 + localStorage.removeItem("chat-login") + setState({user: undefined}) + } + + function initConnection() { + if (socket.connected || initSocket) return; + initSocket = true + console.log('初始化链接') + socket.on('disconnect', () => { + initSocket = false + }) + // 时间 + socket.on('chat', (ret: { content: string, messageId: number }) => { + setState({message: ''}) + if (lastMessage != ret.messageId) { + appendMessage('ai', ret.content) + } else { + appendToLastMessage(ret.content) + } + lastMessage = ret.messageId + }) + socket.on('chat-end', () => { + setState({sending: false}) + if (count > 1) { + setCount(count - 1) + } + }) + socket.connect() + } + + function appendToLastMessage(content: string) { + const last = globalMessageList[globalMessageList.length - 1] + last.content.push(content) + setMessageList([...globalMessageList]) + } + + function loadUserInfo() { + if (localStorage.getItem("chat-login")) { + return; + } + info().then(user => { + setState({user}) + initConnection() + }) + } + + function appendMessage(from: 'you' | 'ai', content: string) { + const newMsg = { + id: messageIndex++, + from, + time: Date.now(), + content: [content], + avatar: from == 'you' ? avatar : avatar1 + } + globalMessageList.push(newMsg) + setMessageList([...globalMessageList]) + } + + function onSendChat() { + if (!state.message) { + return; + } + if (!state.user) { // 没有登录 + setState({showLogin: true}) + return; + } + if (count < 1 && state.user.vip < (Date.now() / 100) >> 0) { + setState({showVip: true}) + return; + } + // 是否已经链接服务 + if (socket.disconnected) { + console.log('服务未链接') + return; + } + setState({sending: true}) + appendMessage('you', state.message) + socket.emit('chat', {message: state.message}) + // sendChat(state.message).then((ret) => { + // setState({message: ''}) + // appendMessage('ai', ret.content) + // }).finally(() => setState({sending: false})) + } + + const scrollToBottom = () => { + (function smoothScroll() { + const currentScroll = document.documentElement.scrollTop || document.body.scrollTop; // 已经被卷掉的高度 + const clientHeight = document.documentElement.clientHeight; // 浏览器高度 + const scrollHeight = document.documentElement.scrollHeight; // 总高度 + if (scrollHeight - 10 > currentScroll + clientHeight) { + window.requestAnimationFrame(smoothScroll); + window.scrollTo(0, currentScroll + (scrollHeight - currentScroll - clientHeight) / 2); + } + })(); + }; + // 监听 + useEffect(loadUserInfo, []) + useEffect(() => { + if (messageList.length == 0) return; + scrollToBottom(); + }, [messageList]) + + return ( +
+
+
+ {state.user ? (<> + + {state.user.username} + + 退出 + ) : setState({showLogin: true})}>登录} +
+
+
+
+ {messageList.map((msg, index) =>
+
+
+ +
+
{msg.content.map((block, blockIndex) =>

{block}

)}
+
+
)} +
+
+
+
+
{ + e.preventDefault(); + onSendChat() + }}> + +
+ + {state.user?.vip && +
setState({showVip: true})}>+增加次数<
} +
+
+
+
+ {state.showLogin && { + setState({showLogin: false}) + localStorage.setItem("chat-login", "yes") + logged && loadUserInfo() + }} + />} + {state.showVip && { + setState({showVip: false}) + opened && loadUserInfo() + }}/>} +
+ ) +} + +export default App diff --git a/src/assets/icon-empty.png b/src/assets/icon-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..97610923b0a553058f6ffdfd66786e4ca8e1f471 GIT binary patch literal 2568 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 S@Y8DtFgLZnQG5MC(tiP{6y~1* literal 0 HcmV?d00001 diff --git a/src/assets/util.less b/src/assets/util.less new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Button/btn.less b/src/components/Button/btn.less new file mode 100644 index 0000000..5bc6a36 --- /dev/null +++ b/src/components/Button/btn.less @@ -0,0 +1,44 @@ +.btn-disabled{ + cursor: not-allowed; + border-color: #d9d9d9; + color: rgba(0, 0, 0, 0.3); + background-color: rgba(0, 0, 0, 0.1); + box-shadow: none; +} +.btn { + --btn-border-color-default: #d9d9d9; + --btn-bg-color-default: #fff; + --btn-hover-color-default: #fff; + border: solid 1px #d9d9d9; + border-radius: var(--border-radius-default); + background-color: #fff; + outline: none; + padding: 8px 20px; + box-sizing: border-box; + font-size: var(--font-size); + cursor: pointer; + + .btn-loading{ + margin-right: 6px; + } + &.btn-block { + width: 100%; + } + &[disabled]{ + .btn-disabled; + } + + &:hover, &:focus { + outline: none; + border-color: var(--color-primary); + color: var(--color-primary); + } + &.btn-primary{ + border-color: var(--color-primary); + background-color: var(--color-primary); + color: #fff; + &[disabled]{ + .btn-disabled; + } + } +} \ No newline at end of file diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx new file mode 100644 index 0000000..80347a0 --- /dev/null +++ b/src/components/Button/index.tsx @@ -0,0 +1,32 @@ +import React, {SVGProps} from "react"; +import IconLoading from "../icons/IconLoading"; +import './btn.less' +import classNames from "../../utils/classnames"; + +export type ButtonProp = { + children?: React.ReactNode; + loading?: boolean + disabled?: boolean + type?: "primary" | "default" + htmlType?: "button" | "submit" + block?: boolean +} & JSX.IntrinsicAttributes & SVGProps + +const Button: React.FC = (props) => { + return ( + + ); +} +export default Button; \ No newline at end of file diff --git a/src/components/Checkbox.tsx b/src/components/Checkbox.tsx new file mode 100644 index 0000000..498dff6 --- /dev/null +++ b/src/components/Checkbox.tsx @@ -0,0 +1,20 @@ +import React from "react"; + + +export type CheckboxProp = { + children?: React.ReactNode + checked?: boolean + onChange?: (checked: boolean) => void +} +const Checkbox: React.FC = (props) => { + return () +} +export default Checkbox; \ No newline at end of file diff --git a/src/components/Login.tsx b/src/components/Login.tsx new file mode 100644 index 0000000..9852373 --- /dev/null +++ b/src/components/Login.tsx @@ -0,0 +1,131 @@ +import React from "react"; +import './login.less' +import IconClose from "./icons/IconClose"; +import Button from "./Button"; +import {useSetState, useCountDown} from "ahooks"; +import Checkbox from "./Checkbox"; +import {login, sendCode} from "../services/api"; + +export type LoginProps = { + onClose: (logged?: boolean) => void +} + +const Login: React.FC = (props) => { + const [state, setState] = useSetState({ + sendLoading: false, + sendEndTime: 0, + ruleChecked: false, + error: '', + loginLoading: false, + }) + + const [data, setData] = useSetState({ + phone: '', + code: '' + }) + const [countdown, formattedRes] = useCountDown({ + targetDate: state.sendEndTime + }) + + function error(e: Error) { + setState({error: e.message}) + } + + function onSubmit() { + if (!data.phone) { + setState({error: '请输入手机号码'}) + return; + } + if (!data.code) { + setState({error: '请输入验证码'}) + return; + } + if (!state.ruleChecked) { + setState({error: '请勾选使用协议'}) + return; + } + setState({error: '', loginLoading: true}) + login(data).then(() => { + props.onClose(true) + }).catch(error).finally(() => { + setState({ + loginLoading: false + }) + }) + } + + function onSend() { + if (!data.phone) { + setState({error: '请输入手机号码'}) + return; + } + setState({sendLoading: true, error: ''}) + sendCode(data.phone).then(() => { + setState({ + sendLoading: false, + sendEndTime: Date.now() + 1000 * 60 + }) + }).catch(error).finally(() => { + setState({ + sendLoading: false + }) + }) + } + + return (
+
+
+
+
props.onClose(false)}> + +
+

登 录

+
+
+ +
+ +86 + setData({phone: e.currentTarget.value})} + className="input" + type="text" + placeholder="输入手机号码" + /> +
+
+
+ +
+
+ setData({code: e.currentTarget.value})} + className="input" type="text" placeholder="输入验证码"/> +
+
+ +
+
+
+
{state.error}
+
+ +
+
+
+ setState({ruleChecked})}>我已阅读并同意 + 《星图比特用户协议》 +
+
+
+
+
+
) +} +export default Login \ No newline at end of file diff --git a/src/components/icons/IconCheck.tsx b/src/components/icons/IconCheck.tsx new file mode 100644 index 0000000..b4c2bcc --- /dev/null +++ b/src/components/icons/IconCheck.tsx @@ -0,0 +1,17 @@ +import classNames from "./../../utils/classnames"; +import React, {SVGProps} from "react"; + +const IconCheck = (props: JSX.IntrinsicAttributes & SVGProps) => ( + + + + ) +; +export default IconCheck; diff --git a/src/components/icons/IconClose.tsx b/src/components/icons/IconClose.tsx new file mode 100644 index 0000000..c52f946 --- /dev/null +++ b/src/components/icons/IconClose.tsx @@ -0,0 +1,21 @@ +import classNames from "./../../utils/classnames"; +import React, {SVGProps} from "react"; + +const IconClose = (props: JSX.IntrinsicAttributes & SVGProps) => ( + + + + + + ) +; +export default IconClose; diff --git a/src/components/icons/IconCopy.tsx b/src/components/icons/IconCopy.tsx new file mode 100644 index 0000000..e359dd0 --- /dev/null +++ b/src/components/icons/IconCopy.tsx @@ -0,0 +1,16 @@ +import classNames from "./../../utils/classnames"; +import React, {SVGProps} from "react"; + +const IconCopy = (props: JSX.IntrinsicAttributes & SVGProps) => ( + + + +); +export default IconCopy; diff --git a/src/components/icons/IconEmpty.tsx b/src/components/icons/IconEmpty.tsx new file mode 100644 index 0000000..349097f --- /dev/null +++ b/src/components/icons/IconEmpty.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import IconImage from './../../assets/icon-empty.png' +import {pxTransform} from "../../utils/pxTransform"; + +export function IconEmpty() { + return ( + empty + ) +} \ No newline at end of file diff --git a/src/components/icons/IconLoading.tsx b/src/components/icons/IconLoading.tsx new file mode 100644 index 0000000..af029b6 --- /dev/null +++ b/src/components/icons/IconLoading.tsx @@ -0,0 +1,18 @@ +import classNames from "./../../utils/classnames"; +import React, {SVGProps} from "react"; + +const IconLoading = (props: JSX.IntrinsicAttributes & SVGProps) => ( + +) +; +export default IconLoading; diff --git a/src/components/login.less b/src/components/login.less new file mode 100644 index 0000000..f66f886 --- /dev/null +++ b/src/components/login.less @@ -0,0 +1,106 @@ +.login-modal-root { + color: #000; + .close { + text-align: right; + padding: 15px; + + .icon { + height: var(--close-size); + width: var(--close-size); + cursor: pointer; + } + } + + .login-dialog { + background-color: #fff; + width: auto; + max-width: calc(100vw - 32px); + box-sizing: border-box; + margin: 0 auto; + position: relative; + //box-shadow: 0 0 10px rgba(0,0,0,0.2); + border-radius: 6px; + } + + .title { + text-align: center; + font-size: 32px; + font-weight: bold; + padding: 10px 0 20px; + line-height: 0; + } + + .body { + padding: 0 30px 30px; + } + + .form-item { + font-size: var(--font-size-lg); + + .label { + margin: 20px 0 4px; + display: block; + font-size: var(--font-size); + font-weight: bold; + } + + } + + .input-wrapper { + display: flex; + align-items: center; + border: var(--border-primary); + padding: 2px; + border-radius: var(--border-radius-default); + + .prefix { + color: var(--color-info); + padding: 0 10px; + border-right: solid 1px var(--color-info); + } + + .input { + border: none; + outline: none; + padding: 6px 10px; + font-size: 18px; + box-sizing: border-box; + display: inline-block; + width: 100%; + min-width: 0; + + &::-webkit-input-placeholder { + font-size: 16px; + color: var(--color-info); + } + } + } + .btn{ + + font-size: var(--font-size-lg); + } + + .btn-send-code { + margin-left: 10px; + } + .btn-send{ + width: 160px; + } + + .verify-code .input { + width: 160px; + } + + .login-notice { + line-height: 30px; + height: 30px; + margin-top: 30px; + text-align: center; + color: var(--color-notice); + } + .rules{ + font-size: var(--font-size-sm); + text-align: center; + margin-top: 60px; + } +} \ No newline at end of file diff --git a/src/components/vip/index.tsx b/src/components/vip/index.tsx new file mode 100644 index 0000000..ca01453 --- /dev/null +++ b/src/components/vip/index.tsx @@ -0,0 +1,112 @@ +import React from "react"; +import './vip.less' +import IconClose from "../icons/IconClose"; +import {useCountDown, useSetState} from "ahooks"; +import classNames from "../../utils/classnames"; +import Button from "../Button"; +import IconCheck from "../icons/IconCheck"; + +export type VipProps = { + onClose: (opened: boolean) => void; +} +const levels = [ + { + id: 1, + title: '年会员', + price: 198, + originPrice: 218, + remark: '最划算', + addition: '最多人购买', + countDown: Date.now() + 3600 * 24 * 1000 + }, + { + id: 2, + title: '季会员', + price: 98, + originPrice: 123, + remark: '1.00/天', + addition: '', + countDown: 0 + }, + { + id: 3, + title: '月会员', + price: 68, + originPrice: 98, + remark: '2.27/天', + addition: '', + countDown: 0 + } +] +const Vip: React.FC = (props) => { + // 当前状态 + const [state, setState] = useSetState({ + selectedIndex: 0 + }) + // 倒计时 + const [_] = useCountDown({ + targetDate: levels[0].countDown + }) + return (
+
+
+
+
props.onClose(false)}> + +
+

会员中心

+
+
+ +

畅享更多高级功能

+
+
+ +

10000+用户已开通

+
+
+
+
+
无限畅聊
+
不限制收发次数
+
+
+
超低延迟
+
低延迟快速恢复
+
+
+
独享接口
+
畅快对话
+
+
+
专属客服
+
1对1客服
+
+
+
+ {levels.map((l, index) => ( +
setState({selectedIndex: index})} + className={classNames('level-item', {selected: state.selectedIndex === index})} + > + {l.addition &&
{l.addition}
} +
{l.title}
+
{l.price}
+
{l.originPrice}
+
+ {/*{l.countDown > 0 ? (`还剩${f.hours}:${f.minutes}:${f.seconds}后结束`) : l.remark}*/} + {l.remark} +
+
))} +
+
+ +
+
+
+
) +} +export default Vip; \ No newline at end of file diff --git a/src/components/vip/vip.less b/src/components/vip/vip.less new file mode 100644 index 0000000..3bf3aa4 --- /dev/null +++ b/src/components/vip/vip.less @@ -0,0 +1,151 @@ + +.vip-wrapper { + color: #fff; + position: relative; + + .close { + text-align: right; + position: absolute; + top: 15px; + right: 15px; + + .icon { + height: var(--close-size); + width: var(--close-size); + cursor: pointer; + color: #fff; + } + } + + .vip-dialog { + background: url(./vip_bg.png) no-repeat; + background-size: cover; + width: 360px; + max-width: calc(100vw - 32px); + box-sizing: border-box; + margin: 0 auto; + position: relative; + border-radius: 10px; + padding: 30px 40px; + } + + h2.title { + font-size: 32px; + } + + .intro { + div { + margin-top: 5px; + } + + .icon { + color: #E0AC8A; + width: 20px; + height: 20px; + margin-right: 2px; + } + } + + // 会员特性 + .features { + display: grid; + column-gap: 20px; + grid-template-columns: auto auto; + } + + .feature-item { + border: solid 1px #fff; + border-radius: 10px; + margin-top: 6px; + padding: 10px; + text-align: center; + line-height: 1.4; + + .name { + font-size: 22px; + } + + .desc { + font-size: var(--font-size-sm); + } + } + + .levels { + display: flex; + margin-top: 40px; + } + + .level-item { + flex: 1; + text-align: center; + margin-right: 10px; + position: relative; + background-color: #1E1E1E; + border: solid 1px #888; + border-radius: 8px; + padding: 10px 0; + line-height: 1; + cursor: pointer; + user-select: none; + &:last-child{ + margin-right: 0; + } + .level-title{ + font-size: 14px; + font-weight: bold; + } + .level-price{ + font-size: 26px; + font-weight: bold; + color: #A00000; + margin: 2px 0; + .unit{ + font-size: 18px; + } + } + .level-origin-price{ + text-decoration: line-through; + color: var(--color-info); + } + .remark{ + font-size: 12px; + transform: scale(0.9); + white-space: nowrap; + margin-top: 4px; + } + .addition-desc { + position: absolute; + background-color: var(--color-notice); + color: #fff; + padding: 2px 6px; + left: 0; + right: 0; + top: -28px; + font-size: 12px; + height: 20px; + line-height: 20px; + border-radius: 10px; + &:after { + content: ' '; + display: block; + position: absolute; + width: 10px; + height: 10px; + background-color: var(--color-notice); + bottom: 0; + left: 50%; + transform: translate(-50%, 50%) rotate(45deg); + } + } + + &.selected{ + background: linear-gradient(147deg, #114BA3 0%, #D3B07A 0%, #EFBA93 19%, #D6A184 38%, #B5865A 58%, #F9BC99 79%, #F2C3A9 100%); + .level-origin-price,.level-title{ + color:#000 + } + } + } + .button{ + margin-top: 20px; + } +} \ No newline at end of file diff --git a/src/components/vip/vip_bg.png b/src/components/vip/vip_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ded56bca4f87c7043229468a0a2c0865e62f8297 GIT binary patch literal 41709 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

6?*qQ^B2wWji{NaO=BL^tx}9j(w}|a#%=_ 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 literal 0 HcmV?d00001 diff --git a/src/index.less b/src/index.less new file mode 100644 index 0000000..3c24493 --- /dev/null +++ b/src/index.less @@ -0,0 +1,312 @@ +:root { + --color-primary: #114BA3; + --color-primary-2: #195cc2; + --color-notice: #A00000; + --color-info: #888888; + --color-border: #CAD4D8; + --border-primary: solid 1px var(--color-border); + --border-radius-default: 8px; + --font-size-sm: 12px; + --font-size: 14px; + --font-size-lg: 16px; + --font-size-xl: 18px; + --font-size-2xl: 22px; + --close-size: 24px; + --app-header-height: 60px; + --app-sender-height: 110px; + line-height: 1.3; + font-weight: 400; + font-size: var(--font-size); + --app-bg-color:#000; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +* { + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; +} +body{ + background-color: var(--app-bg-color); + scroll-behavior: smooth; +} + +.flex-center { + display: flex; + align-items: center; +} + +.margin-center { + margin: auto; +} + +.view-full { + position: fixed; + top: 0; + inset-inline-end: 0; + bottom: 0; + inset-inline-start: 0; + overflow: auto; + outline: 0; + z-index: 1000; +} + +.mask-wrapper { + position: fixed; + top: 0; + inset-inline-end: 0; + bottom: 0; + inset-inline-start: 0; + z-index: 1000; + height: 100%; + //background-color: rgba(250,250, 250, 0.15); + background-color: rgba(0, 0, 0, 0.35); +} + +svg { + &.icon { + width: 16px; + height: 16px; + } +} + +@keyframes loadingCircle { + 100% { + transform: rotate(360deg); + -webkit-transform: rotate(360deg); /* Safari and Chrome */ + } +} + +.ani-loading { + //transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + //-webkit-animation: loadingCircle 1s infinite linear; + animation: loadingCircle 1s infinite linear; + display: inline-block; +} + +.checkbox-wrapper { + .flex-center; + cursor: pointer; + + span { + + } + + .checkbox { + display: inline-block; + position: relative; + margin-right: 4px; + + .checkbox-inner { + box-sizing: border-box; + display: block; + width: 16px; + height: 16px; + padding: 2px; + background-color: #ffffff; + border: 1px solid #d9d9d9; + border-radius: 4px; + transition: all 0.3s; + .flex-center; + + &:after { + content: ' '; + display: inline-block; + box-sizing: border-box; + width: 100%; + height: 100%; + background-color: var(--color-primary); + opacity: 0; + border-radius: 2px; + transition: opacity 0.1s; + } + } + + .checkbox-input { + position: absolute; + inset: 0; + z-index: 1; + width: 100%; + height: 100%; + cursor: pointer; + opacity: 0; + + &:checked + .checkbox-inner:after { + opacity: 1; + } + } + } +} + +.cursor-pointer { + cursor: pointer; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +body { + margin: 0; + scroll-behavior: smooth; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +.app-wrapper { + height: 100vh; + background-color: var(--app-bg-color); + color: #fff; +} + +.content-container { + max-width: 1000px; + margin: auto; +} + +.app-header { + overflow: hidden; + background-color: var(--app-bg-color,#f00); + padding: 10px 20px; + line-height: 40px; + box-sizing: border-box; + height: var(--app-header-height); + color: white; + position: fixed; + top: 0; + left: 0; + right: 0; + + .header { + float: right; + height: 40px; + } + .nickname{ + margin-left: 6px; + } + .logout{ + color: #888888; + } + .line{ + margin: 0 10px; + border-right: solid 1px #888888; + display: block; + height: 14px; + } +} + +.avatar { + width: 36px; + height: 36px; + border-radius: 50%; +} + +.app-send-wrapper { + background: #eee; + color: #fff; + padding: 20px; + box-sizing: border-box; + height: var(--app-sender-height); + + position: fixed; + bottom: 0; + left: 0; + right: 0; + display: flex; + .content-container,form{ + display: flex; + width: 100%; + } + .send-content { + height: calc(var(--app-sender-height) - 40px); + border-radius: 10px; + border: none; + outline: none; + flex: 1; + resize: none; + margin-right: 10px; + box-sizing: border-box; + padding: 10px; + font-size: 16px; + } + .btn-sender{ + height: 56px; + } + .open-vip { + color: var(--color-primary); + text-align: center; + margin-top: 4px; + } +} + +.app-content { + padding-top: calc(var(--app-header-height) + 0px); + padding-bottom: calc(var(--app-sender-height) + 0px); + background-color: var(--app-bg-color); +} + +.message-list-wrapper { + color: #fff; + + .message-item { + background-color: #001427; + padding: 10px 0; + &:nth-child(2n){ + background-color: #0F2839; + } + p + p{ + margin-top: 10px; + } + } + .avatar-container{ + margin-right: 20px; + background-color: rgba(255,255,255,0.5); + height: 40px; + width: 40px; + border-radius: 40px; + .avatar{ + display: block; + height: 40px; + width: 40px; + border-radius: 40px; + } + } + .message-content { + display: flex; + padding: 20px; + line-height: 1.5; + font-size: 16px; + } +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..711a883 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.less' + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + , +) diff --git a/src/services/api.ts b/src/services/api.ts new file mode 100644 index 0000000..7f5c0b1 --- /dev/null +++ b/src/services/api.ts @@ -0,0 +1,27 @@ +import {get, post} from "./request"; + +export type UserModel = { + token: string; + username: string; + account: string; + avatar: string; + vip: number; +} + +export function login(data: any) { + return post('/api/user/login', data) +} +export function info() { + return get('/api/user/info') +} + + +export function sendCode(phone: string) { + return post('/api/sendCode', {phone}) +} + +export function sendChat(message: string) { + return post<{ + body: any, content: string + }>('/api/chat', {message}) +} \ No newline at end of file diff --git a/src/services/request.ts b/src/services/request.ts new file mode 100644 index 0000000..d450add --- /dev/null +++ b/src/services/request.ts @@ -0,0 +1,70 @@ +import axios from 'axios'; + +export interface APIResponse { + code: number; + data?: T; + message: string; +} + +// const baseURL = APP_CONFIG.API_PREFIX; +// const FORM_FORMAT = 'application/x-www-form-urlencoded'; +const JSON_FORMAT = 'application/json'; +export type RequestMethod = 'get' | 'post' | 'put' | 'delete' + +const Axios = axios.create({ + baseURL: APP_CONFIG.API_PREFIX, + timeout: 20000, // 设置超时时长 + headers: { + 'Content-Type': JSON_FORMAT, + } +}) + + +// 请求前拦截 +// Axios.interceptors.request.use(config => { +// return config +// }, err => { +// return Promise.reject(err) +// }) +// +// // 返回后拦截 +// Axios.interceptors.response.use(res => { +// return res +// }, err => { +// if (err.message === 'Network Error') { +// err.message = '网络连接异常!'; +// } else if (err.code === 'ECONNABORTED') { +// err.message = '请求超时,请重试'; +// } +// +// return Promise.reject(err) +// }) + +export function request(url: string, method: RequestMethod, data: any = null) { + return new Promise((resolve, reject) => { + Axios.request>({ + url, + method, + data, + }).then(res => { + if (res.status != 200) { + reject(Error("服务异常,请稍后再试")) + return; + } + const {code, message, data} = res.data + if (code == 0) { + resolve(data as any as T) + } else { + reject(Error(message)) + } + }) + }) +} + +export function post(url: string, data: any) { + return request(url, 'post', data) +} + +export function get(url: string, data: any = {}) { + return request(url, 'get', data) +} diff --git a/src/utils/classnames.ts b/src/utils/classnames.ts new file mode 100644 index 0000000..08d170e --- /dev/null +++ b/src/utils/classnames.ts @@ -0,0 +1,40 @@ +const hasOwn = {}.hasOwnProperty; + +function classNames(...names: any[]) { + const list: string[] = []; + names.forEach(props => { + if(!props) return; + const argType = typeof props; + if (argType === 'string') { + list.push(props) + } else if (Array.isArray(props)) { + if (props.length) { + const inner = classNames.apply(null, props); + if (inner) { + list.push(inner); + } + } + } else if (argType === 'object') { + if (props.className) { + if (typeof props.className === "string") { + list.push(props.className); + } else if (Array.isArray(props.className)) { + list.push(...props.className) + } else { + for (let cls in props.className) { + list.push(cls) + } + } + } else { + for (let key in props) { + if (hasOwn.call(props, key) && props[key]) { + list.push(key); + } + } + } + } + }) + return list.join(' '); +} + +export default classNames \ No newline at end of file diff --git a/src/utils/numbers.ts b/src/utils/numbers.ts new file mode 100644 index 0000000..56f29f8 --- /dev/null +++ b/src/utils/numbers.ts @@ -0,0 +1,4 @@ +export function random(min: number, max: number) { + const n = Math.ceil(Math.random() * (max - min)); + return n + min; +} \ No newline at end of file diff --git a/src/utils/pxTransform.ts b/src/utils/pxTransform.ts new file mode 100644 index 0000000..577df5e --- /dev/null +++ b/src/utils/pxTransform.ts @@ -0,0 +1,27 @@ +const defaultDesignRatio: any = { + 350: 5, + 640: 9, + 750: 10, + 828: 11.5 +}; + +// 默认参数 + + +function toFixed(number: number, precision: number) { + const multiplier = Math.pow(10, precision + 1), + wholeNumber = Math.floor(number * multiplier) + return Math.round(wholeNumber / 10) * 10 / multiplier +} + + +export function pxTransform(size: number, designWidth = 750) { + const config = { + viewportWidth: designWidth, + unitPrecision: defaultDesignRatio[designWidth] || 10, + viewportUnit: 'vw', + minPixelValue: 1 + } + if (size <= config.minPixelValue) return size + config.viewportUnit + return toFixed((size / config.viewportWidth * 100), config.unitPrecision) + config.viewportUnit; +} \ No newline at end of file diff --git a/src/utils/strings.ts b/src/utils/strings.ts new file mode 100644 index 0000000..c0ddcba --- /dev/null +++ b/src/utils/strings.ts @@ -0,0 +1,16 @@ +// 手机号脱敏 +import dayjs from "dayjs"; + +export function hidePhone(phone: string) { + return phone.replace(/^(\d{3}).*(\d{4})$/, '$1****$2') +} + +// 身份证脱敏 +export function hideIDCard(idCard: string) { + return idCard.replace(/^(.{6}).*(.{4})$/, '$1********$2') +} + +export function formatDatetime(timestamp: number | string) { + const timeStr = String(timestamp); + return dayjs(Number(timeStr + (timeStr.length == 10 ? '000' : ''))).format('YYYY-MM-DD HH:mm:ss'); +} \ No newline at end of file diff --git a/src/utils/useOnClickOutside.ts b/src/utils/useOnClickOutside.ts new file mode 100644 index 0000000..43f6a45 --- /dev/null +++ b/src/utils/useOnClickOutside.ts @@ -0,0 +1,15 @@ +import React, {useEffect} from "react"; + +type refType = React.RefObject; +export default function useOnClickOutside(ref: refType, callback: () => void) { + function clickHandler(event: any) { + if (!ref.current?.contains(event.target)) { + callback() + } + } + + useEffect(() => { + document.documentElement.addEventListener('click', clickHandler) + return () => document.documentElement.removeEventListener('click', clickHandler) + }, [ref, callback]) +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..db6a2af --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,22 @@ +/// +interface IAppConfigItem { + CLIENT_ID: string + SECRET: string + API_PREFIX: string + /** + * 部署目录 + */ + DEPLOY_DIR?: string + /** + * 静态资源目录 + */ + PUBLIC_PATH?: string +} + +type IAPP_ENV = 'development' | 'test' | 'production' +type IAppConfig = { + [key in IAPP_ENV]: IAppConfigItem; +}; +// 常量配置类型 +declare const APP_ENV: IAPP_ENV; +declare const APP_CONFIG: IAppConfigItem; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..823e83d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "src" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..c6e4540 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,30 @@ +import {defineConfig} from 'vite' +import react from '@vitejs/plugin-react' +import {viteMockServe} from 'vite-plugin-mock' +import {fileURLToPath} from 'node:url'; +// @ts-ignore +import AppConfig from "./config"; + +const APP_ENV = process.env.NODE_ENV || 'development'; +const APP_CONFIG = AppConfig[APP_ENV] + +// https://vitejs.dev/config/ +export default defineConfig({ + define: { + APP_CONFIG + }, + plugins: [ + react(), + viteMockServe({ + mockPath: './mocks', + watchFiles: true, // 监听文件内容变更 + logger: true + }) + ], + base: APP_CONFIG.PUBLIC_PATH, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +}) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..7fde609 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1387 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.20.12": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": + version "7.20.2" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@babel/plugin-transform-react-jsx-self@^7.18.6": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz#ec98d4a9baafc5a1eb398da4cf94afbb40254a54" + integrity sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-react-jsx-source@^7.19.6": + version "7.19.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" + integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": + version "7.21.2" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.14" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/plugin-node-resolve@^13.0.4": + version "13.3.0" + resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" + integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + deepmerge "^4.2.2" + is-builtin-module "^3.1.0" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/js-cookie@^2.x.x": + version "2.2.7" + resolved "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" + integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== + +"@types/mockjs@^1.0.4": + version "1.0.7" + resolved "https://registry.npmmirror.com/@types/mockjs/-/mockjs-1.0.7.tgz#3a0f1bc3f286ae2891d9592422529268665c88d3" + integrity sha512-OCxXz6hEaJOVpRwuJMiVY5a6LtJcih+br9gwB/Q8ooOBikvk5FpBQ31OlNimXo3EqKha1Z7PFBni+q9m+8NCWg== + +"@types/node@*", "@types/node@^18.14.1": + version "18.14.1" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.14.1.tgz#90dad8476f1e42797c49d6f8b69aaf9f876fc69f" + integrity sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@^18.0.10": + version "18.0.11" + resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" + integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.27": + version "18.0.28" + resolved "https://registry.npmmirror.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" + integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@vitejs/plugin-react@^3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz#d1091f535eab8b83d6e74034d01e27d73c773240" + integrity sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g== + dependencies: + "@babel/core" "^7.20.12" + "@babel/plugin-transform-react-jsx-self" "^7.18.6" + "@babel/plugin-transform-react-jsx-source" "^7.19.6" + magic-string "^0.27.0" + react-refresh "^0.14.0" + +ahooks-v3-count@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz#ddeb392e009ad6e748905b3cbf63a9fd8262ca80" + integrity sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ== + +ahooks@^3.7.4: + version "3.7.4" + resolved "https://registry.npmmirror.com/ahooks/-/ahooks-3.7.4.tgz#25e76a989da324a855eb75758b789ab0644b7a59" + integrity sha512-hvgdqzPUKXn95mK3cGlDCi/ZZqv+FRibCUCFT8zW3hCwLGvixVfnHrIW2/2lgzPdLo8mLjp/XOdIJvcPvE2lgQ== + dependencies: + "@types/js-cookie" "^2.x.x" + ahooks-v3-count "^1.0.0" + dayjs "^1.9.1" + intersection-observer "^0.12.0" + js-cookie "^2.x.x" + lodash "^4.17.21" + resize-observer-polyfill "^1.5.1" + screenfull "^5.0.0" + tslib "^2.4.1" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.3.4: + version "1.3.4" + resolved "https://registry.npmmirror.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +caniuse-lite@^1.0.30001449: + version "1.0.30001457" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz#6af34bb5d720074e2099432aa522c21555a18301" + integrity sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.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" + optionalDependencies: + fsevents "~2.3.2" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@*: + version "10.0.0" + resolved "https://registry.npmmirror.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +dayjs@^1.9.1: + version "1.11.7" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.3.2, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deepmerge@^4.2.2: + version "4.3.0" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.310" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.310.tgz#cb85dc8ceac536e99b20a364d7ab00ea35168f9e" + integrity sha512-/xlATgfwkm5uDDwLw5nt/MNEf7c1oazLURMZLy39vOioGYyYzLWIDT8fZMJak6qTiAJ7udFTy7JG7ziyjNutiA== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-client@~6.4.0: + version "6.4.0" + resolved "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-6.4.0.tgz#88cd3082609ca86d7d3c12f0e746d12db4f47c91" + integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.0.3: + version "5.0.6" + resolved "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" + integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +esbuild@0.11.3: + version "0.11.3" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.11.3.tgz#b57165b907be4ffba651f6450538ce8d8c1d5eb0" + integrity sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw== + +esbuild@^0.16.14: + version "0.16.17" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + optionalDependencies: + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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.4" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.2: + version "4.2.10" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +intersection-observer@^0.12.0: + version "0.12.2" + resolved "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" + integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-builtin-module@^3.1.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +js-cookie@^2.x.x: + version "2.2.1" + resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +less@^4.1.3: + version "4.1.3" + resolved "https://registry.npmmirror.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" + integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mockjs@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06" + integrity sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ== + dependencies: + commander "*" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +needle@^3.1.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.6.3" + sax "^1.2.4" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve@^1.19.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^3.10.0: + version "3.17.2" + resolved "https://registry.npmmirror.com/rollup/-/rollup-3.17.2.tgz#a4ecd29c488672a0606e41ef57474fad715750a9" + integrity sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +screenfull@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" + integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +socket.io-client@^4.6.1: + version "4.6.1" + resolved "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-4.6.1.tgz#80d97d5eb0feca448a0fb6d69a7b222d3d547eab" + integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.4.0" + socket.io-parser "~4.2.1" + +socket.io-parser@~4.2.1: + version "4.2.2" + resolved "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" + integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^2.3.0, tslib@^2.4.1: + version "2.5.0" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vite-plugin-mock@^2.9.6: + version "2.9.6" + resolved "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-2.9.6.tgz#04dd23de6baa052faa5b9ad317514c90d6205e25" + integrity sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg== + dependencies: + "@rollup/plugin-node-resolve" "^13.0.4" + "@types/mockjs" "^1.0.4" + chalk "^4.1.2" + chokidar "^3.5.2" + connect "^3.7.0" + debug "^4.3.2" + esbuild "0.11.3" + fast-glob "^3.2.7" + path-to-regexp "^6.2.0" + +vite@^4.1.0: + version "4.1.4" + resolved "https://registry.npmmirror.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" + integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== + dependencies: + esbuild "^0.16.14" + postcss "^8.4.21" + resolve "^1.22.1" + rollup "^3.10.0" + optionalDependencies: + fsevents "~2.3.2" + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.npmmirror.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==