husq
2023-09-11 946fb25181c06681c56f3946407a8a88ff59c62d
项目详情页面初步搭建、修改、增加弹出框
20 files modified
2 files added
986 ■■■■ changed files
env/.env 3 ●●●● patch | view | raw | blame | history
env/.env.production 3 ●●●● patch | view | raw | blame | history
env/.env.stag 3 ●●●● patch | view | raw | blame | history
package.json 2 ●●● patch | view | raw | blame | history
src/api/http/config.ts 7 ●●●●● patch | view | raw | blame | history
src/api/pilot-bridge.ts 3 ●●●● patch | view | raw | blame | history
src/components/Drawer/Drawer.vue 18 ●●●● patch | view | raw | blame | history
src/components/cesiumMap/cesium.vue 100 ●●●● patch | view | raw | blame | history
src/hooks/use-center-point.ts 3 ●●●● patch | view | raw | blame | history
src/main.ts 2 ●●● patch | view | raw | blame | history
src/mqtt/config.ts 7 ●●●● patch | view | raw | blame | history
src/mqtt/index.ts 5 ●●●● patch | view | raw | blame | history
src/pages/page-web/home.vue 5 ●●●●● patch | view | raw | blame | history
src/pages/page-web/projects/common/common.ts 6 ●●●●● patch | view | raw | blame | history
src/pages/page-web/projects/components/DockConfig.vue 282 ●●●●● patch | view | raw | blame | history
src/pages/page-web/projects/project_list/add_page/add.vue 22 ●●●● patch | view | raw | blame | history
src/pages/page-web/projects/tsa.vue 58 ●●●●● patch | view | raw | blame | history
src/pages/page-web/projects/workspace.vue 5 ●●●●● patch | view | raw | blame | history
src/styles/flex.style.scss 17 ●●●●● patch | view | raw | blame | history
src/websocket/index.ts 8 ●●●●● patch | view | raw | blame | history
src/websocket/util/config.ts 3 ●●●● patch | view | raw | blame | history
yarn.lock 424 ●●●● patch | view | raw | blame | history
env/.env
@@ -1,3 +1,4 @@
VITE_APP_ENVIRONMENT=DEV
VITE_APP_APIGATEWAY_BACKEND_HOST=''
VITE_HTTP = 'http://172.16.13.129:8100'
VITE_HTTP = 'http://172.16.13.129:8100'
VITE_CESIUM_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
env/.env.production
@@ -1,3 +1,4 @@
VITE_APP_ENVIRONMENT=production
VITE_APP_APIGATEWAY_BACKEND_HOST=''
VITE_HTTP = 'http://172.16.13.129:8100'
VITE_HTTP = 'http://172.16.13.129:8100'
VITE_CESIUM_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
env/.env.stag
@@ -10,4 +10,5 @@
### 
VITE_APP_ENVIRONMENT=STAG
VITE_APP_APIGATEWAY_BACKEND_HOST=''
VITE_HTTP = 'http://172.16.13.129:8100'
VITE_HTTP = 'http://172.16.13.129:8100'
VITE_CESIUM_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
package.json
@@ -17,7 +17,7 @@
    "axios": "^0.21.1",
    "eventemitter3": "^5.0.0",
    "mitt": "^3.0.0",
    "mqtt": "^4.3.7",
    "mqtt": "4.0.1",
    "query-string": "^7.0.1",
    "reconnecting-websocket": "^4.4.0",
    "vconsole": "^3.8.1",
src/api/http/config.ts
@@ -1,8 +1,8 @@
/*
 * @Author: 胡思旗 931347610@qq.com
 * @Date: 2023-08-22 09:55:39
 * @LastEditors: 胡思旗 931347610@qq.com
 * @LastEditTime: 2023-08-29 14:59:18
 * @LastEditors: husq 931347610@qq.com
 * @LastEditTime: 2023-09-11 12:04:07
 * @FilePath: \Cloud-API-Demo-Web\src\api\http\config.ts
 * @Description:
 *
@@ -19,7 +19,8 @@
  // http://172.16.13.64:8100
  baseURL: 'http://172.16.13.129:8100', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
  // ws://172.16.13.129:6789/api/v1/ws
  websocketURL: '', // Example: 'ws://192.168.1.1:6789/api/v1/ws'
  // ws://192.168.1.198:1883/
  websocketURL: 'ws://192.168.1.198:8600/drone/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
  // livestreaming
  // RTMP  Note: This IP is the address of the streaming server. If you want to see livestream on web page, you need to convert the RTMP stream to WebRTC stream.
src/api/pilot-bridge.ts
@@ -1,5 +1,5 @@
import { message } from 'ant-design-vue'
import { EComponentName, EPhotoType, ERouterName } from '../types'
import { EComponentName, ELocalStorageKey, EPhotoType, ERouterName } from '../types'
import { CURRENT_CONFIG } from './http/config'
import { EVideoPublishType, LiveStreamStatus } from '../types/live-stream'
import { getRoot } from '/@/root'
@@ -93,6 +93,7 @@
      userName: '',
      elementPreName: 'PILOT'
    }
    const token = localStorage.getItem(ELocalStorageKey.Token)
    components.set(EComponentName.Map, mapParam)
    const wsParam: WsParam = {
      host: CURRENT_CONFIG.websocketURL,
src/components/Drawer/Drawer.vue
@@ -1,6 +1,6 @@
<template>
    <div class="drawer" :class="[show ? 'active':'none']" v-show="show">
        <div class="side-header">
    <div class="drawer" :style="[styleDrawer]" :class="[show ? 'active':'none']" v-show="show">
        <div v-if="isHeader" class="side-header">
            <div class="side-option flex-display flex-align-center flex-justify-between">
                <h2 class="title">{{ title }}</h2>
                <CloseOutlined @click="close" />
@@ -21,7 +21,19 @@
  },
  title: {
    type: String,
    required: true
    // required: true
  },
  // 是否显示头部
  isHeader: {
    type: Boolean,
    default: true
  },
  // 定位css
  styleDrawer: {
    type: Object,
    default: () => ({
      top: 0
    })
  }
})
const emits = defineEmits(['update:show'])
src/components/cesiumMap/cesium.vue
@@ -2,7 +2,7 @@
 * @Author: 胡思旗 931347610@qq.com
 * @Date: 2023-08-22 17:50:30
 * @LastEditors: husq 931347610@qq.com
 * @LastEditTime: 2023-09-07 16:45:18
 * @LastEditTime: 2023-09-11 09:57:01
 * @FilePath: \Cloud-API-Demo-Web\src\components\cesiumMap\cesium.vue
 * @Description:
 *
@@ -11,26 +11,35 @@
<template>
  <div class="height-100 width-100 cesium" id="cesiumContainer"></div>
  <div v-if="centerConfig.type && !centerConfig.latitude" class="pointLongitude">在地图上点击绘制项目中心点</div>
  <div class="switch">
    <div class="2d" v-if="dimension === 3" @click="switchModel('2D')">2D</div>
    <div class="3d" v-else @click="switchModel('3D')">3D</div>
  </div>
</template>
<script setup lang="ts">
import * as Cesium from 'cesium'
import { onMounted, ref, onUnmounted } from 'vue'
import { onMounted, ref, onUnmounted, } from 'vue'
import { pointCenter, clickPoint } from '/@/hooks/use-center-point'
import { useMyStore } from '/@/store'
const viewer: { value: Cesium.Viewer | null | undefined } = ref()
let viewer: Cesium.Viewer | null = null
let handler: Cesium.ScreenSpaceEventHandler
const dimension = ref(3)
const { appContext } = getCurrentInstance()
const global = appContext.config.globalProperties
// const viewer: { value: Cesium.Viewer | null | undefined } = ref()
const store = useMyStore()
const centerConfig = computed(() => {
  return store.state.map.centerConfig
})
const init = () => {
  // Cesium Token
  const cesiumToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
  const cesiumToken = import.meta.env.VITE_CESIUM_TOKEN
  Cesium.Ion.defaultAccessToken = cesiumToken
  Cesium.Camera.DEFAULT_VIEW_FACTOR = -0.45
  // 西南东北,默认显示中国
  Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(110, -25, 110, 90)
  viewer.value = new Cesium.Viewer('cesiumContainer', {
  viewer = new Cesium.Viewer('cesiumContainer', {
    infoBox: false, // 禁用沙箱,解决控制台报错
    animation: false, // 左下角的动画仪表盘
    baseLayerPicker: false, // 右上角的图层选择按钮
@@ -39,9 +48,15 @@
    sceneModePicker: false, // 模式切换按钮
    timeline: false, // 底部的时间轴
    navigationHelpButton: false, // 右上角的帮助按钮,
    selectionIndicator: false, // 是否显示选择指示器
    baseLayer: false,
  })
  handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
  loadLAYER()
  viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK) // 禁用双击
  // viewer.scene.screenSpaceCameraController.minimumZoomDistance = 100
  viewer.scene.screenSpaceCameraController.maximumZoomDistance = 4500000
  global.$viewer = viewer
}
// 加载图层、注解方法
const loadLAYER = () => {
@@ -67,7 +82,7 @@
    tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
    maximumLevel: 50,
  })
  viewer.value?.imageryLayers.addImageryProvider(imageryProvider)
  viewer?.imageryLayers.addImageryProvider(imageryProvider)
  // 天地图中文注记加载
  const annotation = new Cesium.WebMapTileServiceImageryProvider({
    url: TDT_ZJ,
@@ -80,12 +95,12 @@
    tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
    maximumLevel: 50,
  })
  viewer.value?.imageryLayers.addImageryProvider(annotation)
  viewer?.imageryLayers.addImageryProvider(annotation)
}
const Point = (longitude: number, latitude: number) => {
  // 移除地图所有点 重新绘制
  viewer.value?.entities.removeAll()
  const entity = viewer.value?.entities.add({
  viewer?.entities.removeAll()
  const entity = viewer?.entities.add({
    position: Cesium.Cartesian3.fromDegrees(longitude, latitude),
    point: {
      pixelSize: 24,
@@ -100,27 +115,47 @@
  //   duration: 2
  // })
}
// 切换为二三维模式
const switchModel = (type: string) => {
  switch (type) {
    case '2D':
      viewer.scene.camera.setView({
        orientation: {
          pitch: Cesium.Math.toRadians(-60),
          heading: Cesium.Math.toRadians(0),
        }
      })
      dimension.value = 2
      break
    case '3D':
      viewer.scene.camera.setView({
        orientation: {
          pitch: Cesium.Math.toRadians(-90),
          heading: Cesium.Math.toRadians(0),
        }
      })
      dimension.value = 3
  }
}
// 设置项目中所有的项目中心坐标
watch(() => store.state.map.pointList, (newVal, oldVal) => {
  if (newVal) {
    pointCenter(viewer.value, newVal)
    clickPoint(viewer.value, newVal)
watch(() => store.state.map.pointList, (newVal) => {
  if (newVal && newVal.length > 0) {
    pointCenter(viewer, newVal)
    clickPoint(viewer, newVal)
  }
}, {
  deep: true
})
// 点击地图生成项目中心点
watch(() => store.state.map.centerConfig.type, (newVal) => {
  const handler = new Cesium.ScreenSpaceEventHandler(viewer.value?.scene.canvas)
  console.log(newVal, 'newVal')
  if (newVal === false) {
    viewer.value?.entities.removeAll()
    console.log('===false===')
  if (newVal === false || !store.state.map.centerConfig.type) {
    viewer?.entities.removeAll()
    handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
  } else {
    console.log('===true===')
    handler.setInputAction(function (e: any) {
      const cartesian = viewer.value?.camera.pickEllipsoid(e.position, viewer.value?.scene.globe.ellipsoid)
      const cartesian = viewer?.camera.pickEllipsoid(e.position, viewer?.scene.globe.ellipsoid)
      if (cartesian) {
        const cartographic = Cesium.Cartographic.fromCartesian(cartesian)
        const longitude = Cesium.Math.toDegrees(cartographic.longitude)
@@ -130,7 +165,6 @@
          latitude,
        }
        store.commit('SET_CENTER_CONFIG_LATITUDE', data)
        console.log(data, 'data')
        Point(longitude, latitude)
      }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK
@@ -144,7 +178,7 @@
})
// 销毁地图模型
onUnmounted(() => {
  viewer.value = null
  viewer = null
})
</script>
@@ -169,4 +203,26 @@
  text-align: center;
  font-size: 16px;
}
.switch {
  position: absolute;
  background-color: #fff;
  z-index: 30;
  bottom: 80px;
  font-size: 14px;
  right: 20px;
  cursor: pointer;
  box-shadow: 0 0 4px 0 rgba(0, 0, 0, .6);
  width: 28px;
  height: 28px;
  color: #4e4e4e;
  font-weight: 600;
  display: flex;
  align-items: center;
  justify-content: center;
}
.switch:hover {
  color: #1180ff;
}
</style>
src/hooks/use-center-point.ts
@@ -35,6 +35,7 @@
  const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
  handler.setInputAction(function (click: any) {
    const pickedObject = viewer.scene.pick(click.position)
    console.log(pickedObject, 'pickObject')
    if (Cesium.defined(pickedObject)) {
      const list = longitudeList.filter((v: { id:string, longitude: number; latitude: number; }) => v.id === pickedObject.id.id)
      if (pickedObject.id.label) {
@@ -52,5 +53,5 @@
    }
  }
  , Cesium.ScreenSpaceEventType.LEFT_CLICK)
  handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
  // handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
}
src/main.ts
@@ -6,7 +6,7 @@
import store, { storeKey } from './store'
import { createInstance } from '/@/root'
import '/@/styles/index.scss'
const app = createInstance(App)
const app = createInstance(App) // 引入css
app.use(store, storeKey)
app.use(router)
app.use(CommonComponents)
src/mqtt/config.ts
@@ -1,4 +1,3 @@
import {
  IClientOptions,
} from 'mqtt'
@@ -9,4 +8,10 @@
  resubscribe: true, // 断开重连后,再次订阅原订阅
  reconnectPeriod: 10000, // 重连间隔时间: 5s
  keepalive: 1, // 心跳间隔时间:1s
  clientId: 'DroneWeb',
  // username: 'guest',
  // password: 'guest',
  host: '192.168.1.198',
  protocol: 'ws',
  port: 8083,
}
src/mqtt/index.ts
@@ -34,10 +34,13 @@
      ...OPTIONS,
      ...this._options,
    })
    console.log(this._client, 'client')
    this._hasInit = true
    if (this._client) {
      this._client.on('reconnect', this._onReconnect)
      this._client.on('connect', () => {
        console.log('connect')
      })
      // 消息监听
      this._client.on('message', this._onMessage)
src/pages/page-web/home.vue
@@ -41,11 +41,6 @@
    }
  }
}
watch(route, newVal => {
  console.log(newVal, 'val')
}, {
  immediate: true
})
// 监听ws 消息
useConnectWebSocket(messageHandler)
src/pages/page-web/projects/common/common.ts
New file
@@ -0,0 +1,6 @@
export const styleDrawer = {
  height: 'auto',
  width: '400px',
  top: '30px',
  left: '70%'
}
src/pages/page-web/projects/components/DockConfig.vue
New file
@@ -0,0 +1,282 @@
<template>
    <div class="config_dock">
        <div class="w100 option flex-display">
            <div class="option-left-icon flex-display">
                <RobotOutlined :style="{ fontSize: '48px' }" />
                <div style="margin-top: 10px;">Dock</div>
            </div>
            <div class="option-right">
                <div class="wrapper">
                    <div class="wrapper-item flex-display">
                        <span class="item-left">设备空闲中</span>
                        <span class="item-right dock-status">当前正常</span>
                    </div>
                    <div class="wrapper-item  flex-display">
                        <div class="item-left">
                            <CloudOutlined />
                            <span>正常</span>
                        </div>
                        <div class="item-right flex-display flex-align-center">
                            <span class="mr20">
                                <ThunderboltOutlined />
                                34°C
                            </span>
                            <span class="mr20">
                                <FundProjectionScreenOutlined />
                                436kb/s
                            </span>
                            <span class="mr20">
                                <UploadOutlined />
                                0
                            </span>
                        </div>
                    </div>
                </div>
                <div class="option-btn flex-display flex-justify-between">
                    <div class="btn">
                        <a-button type="primary" @click="videoControl = !videoControl" :class="{ unchecked: !videoControl }"
                            style="width: 100%;">
                            <template #icon>
                                <VideoCameraOutlined />
                            </template>
                            监控
                        </a-button>
                    </div>
                    <div class="btn">
                        <a-button type="primary" @click="optionControl = !optionControl"
                            :class="{ unchecked: !optionControl }" style="width: 100%;">
                            <template #icon>
                                <ToolOutlined />
                            </template>
                            操作
                        </a-button>
                    </div>
                </div>
            </div>
        </div>
        <div class="video">
            <!-- <div class="video-option">
                <a-tooltip title="关闭补光灯"></a-tooltip>
            </div> -->
            <video auto src="https://cdn.jsdelivr.net/gh/xdlumia/files/video-play/IronMan.mp4"
                style="width: 100%;height: 200px;"></video>
        </div>
        <div class="w100 option flex-display aerial">
            <div class="option-left-icon flex-display">
                <RobotOutlined :style="{ fontSize: '48px' }" />
                <div style="margin-top: 10px;">Dock</div>
            </div>
            <div class="option-right">
                <div class="wrapper">
                    <div class="wrapper-item flex-display">
                        <span class="item-left">舱内关机</span>
                        <span class="item-right dock-status">N/A</span>
                    </div>
                    <div class="wrapper-item  flex-display">
                        <span class="w100 text-center f12" style="color: #4e4e4e;">当前设备已关机,无法进行直播</span>
                        <!-- <div class="item-left">
                            <CloudOutlined />
                            <span>正常</span>
                        </div>
                        <div class="item-right flex-display flex-align-center">
                            <span class="mr20">
                                <ThunderboltOutlined />
                                34°C
                            </span>
                        </div> -->
                    </div>
                </div>
                <div class="option-btn flex-display flex-justify-between">
                    <div class="btn" style="width: 100%;">
                        <a-button type="primary" @click="flyControl = !flyControl" :class="{ unchecked: !flyControl }"
                            style="width: 100%;">
                            <template #icon>
                                <BoxPlotOutlined />
                            </template>
                            飞行控制
                        </a-button>
                    </div>
                </div>
            </div>
        </div>
        <div class="takeoff flex-display flex-align-center">
            <div class="takeoff-left mr15 flex-display flex-align-center flex-direction-column">
                <RobotOutlined :style="{ fontSize: '28px' }" />
                <div style="margin-top: 10px;">一键起飞</div>
            </div>
            <div class="divider"></div>
            <div class="takeoff-middle"></div>
            <div class="takeoff-right  flex-display flex-justify-center flex-align-center flex-direction-column">
                <div class="mb5 input-box flex-display flex-align-center">
                    <span class="f10 label mr15">安全离场高(ALT)</span>
                    <a-input size="small" class="input-style" suffix="m" v-model:value="option.safe_height" />
                </div>
                <div class="mb5 input-box flex-display flex-align-center">
                    <span class="f10 label mr15">飞行作业高(AGL)</span>
                    <a-input size="small" class="input-style" suffix="m" v-model:value="option.fly_height" />
                </div>
                <div class="mb5 input-box flex-display flex-align-center">
                    <span class="f10 label mr15">返航高(ALT)</span>
                    <a-input size="small" class="input-style" suffix="m" v-model:value="option.return_height" />
                </div>
                <div class="mb5 select-box flex-display flex-align-center">
                    <span class="f10 label mr15">失联动作</span>
                    <a-select :dropdownMatchSelectWidth="false" class="select-style" :bordered="false" size="small" ref="select"
                        v-model:value="option.lose_connection" style="width: 60px" @change="handleChange">
                        <a-select-option value="1">悬停</a-select-option>
                        <a-select-option value="2">返航</a-select-option>
                        <a-select-option value="3">继续执行</a-select-option>
                    </a-select>
                </div>
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
import { VideoCameraOutlined, RobotOutlined, ToolOutlined, CloudOutlined, ThunderboltOutlined, FundProjectionScreenOutlined, UploadOutlined, BoxPlotOutlined } from '@ant-design/icons-vue'
import Drawer from '/@/components/Drawer/Drawer.vue'
const videoControl = ref(false)
const optionControl = ref(false)
const flyControl = ref(false)
const option = ref({
  safe_height: 60,
  fly_height: 60,
  return_height: 60,
  lose_connection: '1',
})
const handleChange = (e: string) => {
  console.log(e, 'eee')
}
</script>
<style scoped lang="scss">
.config_dock {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    :deep(.ant-input-affix-wrapper > input.ant-input) {
        background: #101010;
        color: #fff;
        text-align: center;
        margin-right: 5px;
        width: 30px;
    }
    :deep(.ant-input-affix-wrapper .ant-input-suffix) {
        color: #fff;
    }
    .unchecked {
        color: #fff;
        background-color: #3c3c3c;
        border: none;
    }
    .option {
        width: 100%;
        height: 120px;
        align-items: center;
        .option-left-icon {
            flex-direction: column;
            justify-content: center;
            align-items: center;
            background-color: #3d3d3d;
            padding: 10px;
        }
        .option-right {
            flex: 1;
            padding: 5px;
            .wrapper {
                width: 100%;
                .wrapper-item {
                    align-items: center;
                    justify-content: space-between;
                    margin-bottom: 10px;
                    .item-left {
                        width: 100px;
                    }
                    .item-right {
                        flex: 1;
                    }
                    .dock-status {
                        background-color: #5d5f61;
                        padding: 0 5px;
                        color: #fff;
                    }
                }
            }
            .option-btn {
                width: 100%;
                .btn {
                    width: 48%;
                }
            }
        }
    }
    .video {
        width: 100%;
        height: 80%;
        position: relative;
        .video-option {
            display: flex;
            align-items: center;
            justify-content: flex-end;
        }
    }
    .takeoff {
        padding: 5px;
        height: 100px;
        width: 100%;
        margin-bottom: 10px;
        .takeoff-left {
            background-color: #3d3d3d;
            padding: 10px;
            width: 90px;
            height: 90px;
            justify-content: center;
        }
        .input-style {
            width: 60px;
            padding: 0;
            background-color: #101010;
            border: none;
        }
        .select-style {
            background-color: #3c3c3c;
            padding: 0;
            color: #fff;
            font-size: 10px;
        }
        .label {
            min-width: 100px;
            text-align: right;
        }
        .divider {
            height: 100%;
            width: 1.12px;
            background-color: hsla(0, 0%, 100%, .1);
        }
    }
}</style>
src/pages/page-web/projects/project_list/add_page/add.vue
@@ -368,36 +368,36 @@
        }
        .ant-table-project :deep(.project_dark) td {
            background-color: #232323;
            color: #fff;
            border: none;
            background-color: #232323 !important;
            color: #fff !important;
            border: none !important;
            border-bottom: 1px solid #4f4f4f;
            padding: 10px;
        }
        .ant-table-project :deep(.ant-table-placeholder) {
            background: #434343;
            background: #434343 !important;
            border: none !important;
        }
        .ant-table-project :deep(.ant-table-thead) th {
            background: #3c3c3c;
            color: #fff;
            border: 1px solid #4f4f4f;
            background: #3c3c3c !important;
            color: #fff !important;
            border: 1px solid #4f4f4f !important;
            padding: 10px;
        }
        .ant-table-project :deep(.ant-table-body) table {
            border: 1px solid #4f4f4f;
            border-right: 1px solid #4f4f4f;
            border: 1px solid #4f4f4f !important;
            border-right: 1px solid #4f4f4f !important;
        }
        .ant-table-project :deep(.ant-table-body) {
            background: #434343;
            background: #434343 !important;
        }
        .ant-table-project :deep(.ant-empty-description) {
            color: #fff;
            color: #fff !important;
        }
    }
src/pages/page-web/projects/tsa.vue
@@ -15,7 +15,7 @@
            <a-empty style="color: #fff;" :image="simpleImage" description="暂无数据" :image-style="{ height: '60px' }" />
          </div>
          <div v-else class="fz12" style="color: white;">
            <div v-for="dock in onlineDocks.data" :key="dock.sn" style="background: #3c3c3c; height: 90px; width: 250px; margin-bottom: 10px;">
            <div v-for="dock in onlineDocks.data" :key="dock.sn" style="background: #3c3c3c; height: 90px; margin-bottom: 10px;">
              <div style="border-radius: 2px; height: 100%; width: 100%;" class="flex-row flex-justify-between flex-align-center">
                <div style="float: left; padding: 0px 5px 8px 8px; width: 88%">
                  <div style="width: 80%; height: 30px; line-height: 30px; font-size: 16px;">
@@ -26,6 +26,7 @@
                  <div class="mt5 flex-align-center flex-row flex-justify-between" style="background: #595959;">
                    <div class="flex-align-center flex-row">
                      <span class="ml5 mr5"><RobotOutlined /></span>
                      132
                      <div class="font-bold text-hidden" style="max-width: 80px;" :style="dockInfo[dock.gateway.sn] && dockInfo[dock.gateway.sn].basic_osd?.mode_code !== EDockModeCode.Disconnected ? 'color: #00ee8b' :  'color: red;'">
                        {{ dockInfo[dock.gateway.sn] ? EDockModeCode[dockInfo[dock.gateway.sn].basic_osd?.mode_code] : EDockModeCode[EDockModeCode.Disconnected] }}
                      </div>
@@ -142,7 +143,7 @@
            <a-empty :image="simpleImage" style="color: #fff;"  description="暂无数据" :image-style="{ height: '60px' }" />
          </div>
          <div v-else class="fz12" style="color: white;">
            <div v-for="device in onlineDevices.data" :key="device.sn" style="background: #3c3c3c; height: 90px; width: 250px; margin-bottom: 10px;">
            <div v-for="device in onlineDevices.data" :key="device.sn" style="background: #3c3c3c; height: 90px; margin-bottom: 10px;">
              <div class="battery-slide" v-if="deviceInfo[device.sn]">
                <div style="background: #535759; width: 100%;"></div>
                <div class="capacity-percent" :style="{ width: deviceInfo[device.sn].battery.capacity_percent + '%'}"></div>
@@ -186,12 +187,17 @@
        </a-collapse-panel>
      </a-collapse>
    </div>
    <Drawer title="项目设置" :styleDrawer="styleDrawer" v-model:show="showDrawer">
      <DockConfig />
    </Drawer>
  </div>
</template>
<script lang="ts" setup>
import { styleDrawer } from './common/common'
import { computed, onMounted, reactive, ref, watch, WritableComputedRef } from 'vue'
import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
import Drawer from '/@/components/Drawer/Drawer.vue'
import noData from '/@/assets/icons/no-data.png'
import { Empty } from 'ant-design-vue'
import rc from '/@/assets/icons/rc.png'
@@ -200,6 +206,10 @@
import { getDeviceTopo, getUnreadDeviceHms, updateDeviceHms } from '/@/api/manage'
import { RocketOutlined, EyeInvisibleOutlined, EyeOutlined, RobotOutlined, DoubleRightOutlined } from '@ant-design/icons-vue'
import { EHmsLevel } from '/@/types/enums'
import { UranusMqtt } from '/@/mqtt/index'
import DockConfig from './components/DockConfig.vue'
const { appContext } = getCurrentInstance()
const global = appContext.config.globalProperties
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE
const store = useMyStore()
const username = ref(localStorage.getItem(ELocalStorageKey.Username))
@@ -207,7 +217,7 @@
const osdVisible = ref({} as OSDVisible)
const hmsVisible = new Map<string, boolean>()
const scorllHeight = ref()
const showDrawer = ref(false)
const onlineDevices = reactive({
  data: [] as OnlineDevice[]
})
@@ -220,8 +230,8 @@
      sn: '我是sn字段',
      mode: '我是mode字段',
      gateway: {
        model: '我是gateway.model字段',
        callsign: '我是gateway.callsign字段',
        model: 'gateway.model',
        callsign: 'gateway.callsign',
        sn: '我是gateway.sn字段',
        mode: '我是gateway.mode字段',
      },
@@ -249,6 +259,9 @@
})
onMounted(() => {
  console.log(global, 'global')
  // const mqtt = new UranusMqtt('ws://192.168.1.198:8083/mqtt', {})
  // mqtt.initMqtt()
  getOnlineTopo()
  setTimeout(() => {
    watch(() => store.state.deviceStatusEvent,
@@ -314,23 +327,24 @@
}
function switchVisible (e: any, device: OnlineDevice, isDock: boolean, isClick: boolean) {
  if (!isClick) {
    e.target.style.cursor = 'not-allowed'
    return
  }
  if (device.sn === osdVisible.value.sn) {
    osdVisible.value.visible = !osdVisible.value.visible
  } else {
    osdVisible.value.sn = device.sn
    osdVisible.value.callsign = device.callsign
    osdVisible.value.model = device.model
    osdVisible.value.visible = true
    osdVisible.value.gateway_sn = device.gateway.sn
    osdVisible.value.is_dock = isDock
    osdVisible.value.gateway_callsign = device.gateway.callsign
    osdVisible.value.payloads = device.payload
  }
  store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
  showDrawer.value = !showDrawer.value
  // if (!isClick) {
  //   e.target.style.cursor = 'not-allowed'
  //   return
  // }
  // if (device.sn === osdVisible.value.sn) {
  //   osdVisible.value.visible = !osdVisible.value.visible
  // } else {
  //   osdVisible.value.sn = device.sn
  //   osdVisible.value.callsign = device.callsign
  //   osdVisible.value.model = device.model
  //   osdVisible.value.visible = true
  //   osdVisible.value.gateway_sn = device.gateway.sn
  //   osdVisible.value.is_dock = isDock
  //   osdVisible.value.gateway_callsign = device.gateway.callsign
  //   osdVisible.value.payloads = device.payload
  // }
  // store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
}
function getUnreadHms (sn: string) {
src/pages/page-web/projects/workspace.vue
@@ -129,8 +129,9 @@
  .left {
    display: flex;
    width: 335px;
    flex: 0 0 335px;
    // width: 335px;
    flex: 1;
    // flex: 0 0 335px;
    background-color: #232323;
    .main-content {
src/styles/flex.style.scss
@@ -6,6 +6,16 @@
  align-items: center;
  justify-content: center;
}
.text-center {
  text-align: center
}
.f12 {
  font-size: 12px
}
.f10 {
  font-size: 10px
}
// .border-bottom {
//   position: relative;
//   box-sizing: border-box;
@@ -40,6 +50,9 @@
.flex-align-center {
  align-items: center;
}
.flex-direction-column {
  flex-direction: column;
}
.flex-justify-start {
@@ -91,7 +104,9 @@
.height-100 {
  height: 100%;
}
.w100 {
  width: 100%;
}
//margin
m-5 {
  margin: -5px !important;
src/websocket/index.ts
@@ -1,5 +1,7 @@
import { message } from 'ant-design-vue'
import ReconnectingWebSocket from 'reconnecting-websocket'
import { ELocalStorageKey } from '../types'
interface WebSocketOptions {
  data: any
@@ -35,14 +37,14 @@
    if (!this._url) {
      return
    }
    const token: string = localStorage.getItem(ELocalStorageKey.Token) || '' as string
    // 会自动重连,无需处理重连逻辑
    console.log(token, 'token')
    this._socket = new ReconnectingWebSocket(this._url, [], {
      maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3...
      minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s
      maxRetries: 5
      maxRetries: 5,
    })
    this._hasInit = true
    this._socket.addEventListener('open', this._onOpen.bind(this))
src/websocket/util/config.ts
@@ -3,6 +3,7 @@
export function getWebsocketUrl () {
  const token: string = localStorage.getItem(ELocalStorageKey.Token) || '' as string
  const url = CURRENT_CONFIG.websocketURL + '?x-auth-token=' + encodeURI(token)
  const url = CURRENT_CONFIG.websocketURL
  // const url = CURRENT_CONFIG.websocketURL + '?Authorization=' + encodeURI(token)
  return url
}
yarn.lock
@@ -1010,6 +1010,11 @@
  resolved "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz"
  integrity sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=
async-limiter@~1.0.0:
  version "1.0.1"
  resolved "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async-validator@^3.3.0:
  version "3.5.2"
  resolved "https://registry.npmmirror.com/async-validator/download/async-validator-3.5.2.tgz"
@@ -1052,9 +1057,9 @@
  resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz"
  integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=
base64-js@^1.3.1:
base64-js@^1.3.0, base64-js@^1.3.1:
  version "1.5.1"
  resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz"
  resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
base@^0.11.1:
@@ -1216,6 +1221,14 @@
  dependencies:
    function-bind "^1.1.1"
    get-intrinsic "^1.0.2"
callback-stream@^1.0.2:
  version "1.1.0"
  resolved "https://registry.npmmirror.com/callback-stream/-/callback-stream-1.1.0.tgz#4701a51266f06e06eaa71fc17233822d875f4908"
  integrity sha512-sAZ9kODla+mGACBZ1IpTCAisKoGnv6PykW7fPk1LrM+mMepE18Yz0515yoVcrZy7dQsTUp3uZLQ/9Sx1RnLoHw==
  dependencies:
    inherits "^2.0.1"
    readable-stream "> 1.0.0 < 3.0.0"
callsites@^3.0.0:
  version "3.1.0"
@@ -1400,14 +1413,14 @@
  resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz"
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
concat-stream@^2.0.0:
  version "2.0.0"
  resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz"
  integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
concat-stream@^1.6.2:
  version "1.6.2"
  resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
  dependencies:
    buffer-from "^1.0.0"
    inherits "^2.0.3"
    readable-stream "^3.0.2"
    readable-stream "^2.2.2"
    typedarray "^0.0.6"
constant-case@^3.0.4:
@@ -1509,6 +1522,14 @@
  resolved "https://registry.npmmirror.com/csstype/download/csstype-2.6.19.tgz?cache=0&sync_timestamp=1637224514674&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcsstype%2Fdownload%2Fcsstype-2.6.19.tgz"
  integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==
d@1, d@^1.0.1:
  version "1.0.1"
  resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
  dependencies:
    es5-ext "^0.10.50"
    type "^1.0.1"
debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
  version "2.6.9"
  resolved "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz"
@@ -1523,7 +1544,7 @@
  dependencies:
    ms "^2.1.1"
debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3:
  version "4.3.3"
  resolved "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz"
  integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
@@ -1688,14 +1709,14 @@
  dependencies:
    readable-stream "^2.0.2"
duplexify@^4.1.1:
  version "4.1.2"
  resolved "https://registry.npmmirror.com/duplexify/-/duplexify-4.1.2.tgz"
  integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==
duplexify@^3.5.1, duplexify@^3.6.0:
  version "3.7.1"
  resolved "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
  integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
  dependencies:
    end-of-stream "^1.4.1"
    inherits "^2.0.3"
    readable-stream "^3.1.1"
    end-of-stream "^1.0.0"
    inherits "^2.0.1"
    readable-stream "^2.0.0"
    stream-shift "^1.0.0"
earcut@^2.2.4:
@@ -1728,7 +1749,7 @@
  resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz"
  integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
  version "1.4.4"
  resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz"
  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -1791,6 +1812,56 @@
    is-callable "^1.1.4"
    is-date-object "^1.0.1"
    is-symbol "^1.0.2"
es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14:
  version "0.10.62"
  resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
  integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
  dependencies:
    es6-iterator "^2.0.3"
    es6-symbol "^3.1.3"
    next-tick "^1.1.0"
es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
  version "2.0.3"
  resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
  integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
  dependencies:
    d "1"
    es5-ext "^0.10.35"
    es6-symbol "^3.1.1"
es6-map@^0.1.5:
  version "0.1.5"
  resolved "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
  integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==
  dependencies:
    d "1"
    es5-ext "~0.10.14"
    es6-iterator "~2.0.1"
    es6-set "~0.1.5"
    es6-symbol "~3.1.1"
    event-emitter "~0.3.5"
es6-set@~0.1.5:
  version "0.1.6"
  resolved "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.6.tgz#5669e3b2aa01d61a50ba79964f733673574983b8"
  integrity sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==
  dependencies:
    d "^1.0.1"
    es5-ext "^0.10.62"
    es6-iterator "~2.0.3"
    es6-symbol "^3.1.3"
    event-emitter "^0.3.5"
    type "^2.7.2"
es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1:
  version "3.1.3"
  resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
  dependencies:
    d "^1.0.1"
    ext "^1.1.2"
esbuild@^0.18.10:
  version "0.18.20"
@@ -2065,6 +2136,14 @@
  resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz"
  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
event-emitter@^0.3.5, event-emitter@~0.3.5:
  version "0.3.5"
  resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
  integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
  dependencies:
    d "1"
    es5-ext "~0.10.14"
eventemitter3@^5.0.0:
  version "5.0.0"
  resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.0.tgz"
@@ -2083,6 +2162,13 @@
    snapdragon "^0.8.1"
    to-regex "^3.0.1"
ext@^1.1.2:
  version "1.7.0"
  resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
  integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
  dependencies:
    type "^2.7.2"
extend-shallow@^2.0.1:
  version "2.0.1"
  resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz"
@@ -2097,6 +2183,11 @@
  dependencies:
    assign-symbols "^1.0.0"
    is-extendable "^1.0.1"
extend@^3.0.0:
  version "3.0.2"
  resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
extglob@^2.0.2:
  version "2.0.4"
@@ -2292,6 +2383,14 @@
  resolved "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz"
  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
glob-parent@^3.1.0:
  version "3.1.0"
  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
  integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==
  dependencies:
    is-glob "^3.1.0"
    path-dirname "^1.0.0"
glob-parent@^5.1.2, glob-parent@~5.1.2:
  version "5.1.2"
  resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz"
@@ -2299,7 +2398,35 @@
  dependencies:
    is-glob "^4.0.1"
glob@^7.1.3, glob@^7.1.6:
glob-stream@^6.1.0:
  version "6.1.0"
  resolved "https://registry.npmmirror.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
  integrity sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==
  dependencies:
    extend "^3.0.0"
    glob "^7.1.1"
    glob-parent "^3.1.0"
    is-negated-glob "^1.0.0"
    ordered-read-streams "^1.0.0"
    pumpify "^1.3.5"
    readable-stream "^2.1.5"
    remove-trailing-separator "^1.0.1"
    to-absolute-glob "^2.0.0"
    unique-stream "^2.0.2"
glob@^7.1.1:
  version "7.2.3"
  resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.1.1"
    once "^1.3.0"
    path-is-absolute "^1.0.0"
glob@^7.1.3:
  version "7.2.0"
  resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz"
  integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -2435,13 +2562,15 @@
    capital-case "^1.0.4"
    tslib "^2.0.3"
help-me@^3.0.0:
  version "3.0.0"
  resolved "https://registry.npmmirror.com/help-me/-/help-me-3.0.0.tgz"
  integrity sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==
help-me@^1.0.1:
  version "1.1.0"
  resolved "https://registry.npmmirror.com/help-me/-/help-me-1.1.0.tgz#8f2d508d0600b4a456da2f086556e7e5c056a3c6"
  integrity sha512-P/IZ8yOMne3SCTHbVY429NZ67B/2bVQlcYGZh2iPPbdLrEQ/qY5aGChn0YTDmt7Sb4IKRI51fypItav+lNl76w==
  dependencies:
    glob "^7.1.6"
    readable-stream "^3.6.0"
    callback-stream "^1.0.2"
    glob-stream "^6.1.0"
    through2 "^2.0.1"
    xtend "^4.0.0"
htmlparser2@^3.8.3:
  version "3.10.1"
@@ -2525,6 +2654,14 @@
    get-intrinsic "^1.1.0"
    has "^1.0.3"
    side-channel "^1.0.4"
is-absolute@^1.0.0:
  version "1.0.0"
  resolved "https://registry.npmmirror.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
  dependencies:
    is-relative "^1.0.0"
    is-windows "^1.0.1"
is-accessor-descriptor@^0.1.6:
  version "0.1.6"
@@ -2630,15 +2767,22 @@
  dependencies:
    is-plain-object "^2.0.4"
is-extglob@^2.1.1:
is-extglob@^2.1.0, is-extglob@^2.1.1:
  version "2.1.1"
  resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz"
  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-fullwidth-code-point@^3.0.0:
  version "3.0.0"
  resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&sync_timestamp=1618552489864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz"
  integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=
is-glob@^3.1.0:
  version "3.1.0"
  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
  integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==
  dependencies:
    is-extglob "^2.1.0"
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
  version "4.0.3"
@@ -2646,6 +2790,11 @@
  integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=
  dependencies:
    is-extglob "^2.1.1"
is-negated-glob@^1.0.0:
  version "1.0.0"
  resolved "https://registry.npmmirror.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
  integrity sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==
is-negative-zero@^2.0.1:
  version "2.0.2"
@@ -2703,6 +2852,13 @@
    call-bind "^1.0.2"
    has-tostringtag "^1.0.0"
is-relative@^1.0.0:
  version "1.0.0"
  resolved "https://registry.npmmirror.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
  dependencies:
    is-unc-path "^1.0.0"
is-shared-array-buffer@^1.0.1:
  version "1.0.1"
  resolved "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz"
@@ -2722,6 +2878,13 @@
  dependencies:
    has-symbols "^1.0.2"
is-unc-path@^1.0.0:
  version "1.0.0"
  resolved "https://registry.npmmirror.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
  dependencies:
    unc-path-regex "^0.1.2"
is-weakref@^1.0.1:
  version "1.0.2"
  resolved "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz"
@@ -2729,10 +2892,10 @@
  dependencies:
    call-bind "^1.0.2"
is-windows@^1.0.2:
is-windows@^1.0.1, is-windows@^1.0.2:
  version "1.0.2"
  resolved "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz"
  integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=
  resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
isarray@1.0.0, isarray@~1.0.0:
  version "1.0.0"
@@ -2760,11 +2923,6 @@
  version "2.6.4"
  resolved "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz"
  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
js-sdsl@4.3.0:
  version "4.3.0"
  resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz"
  integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
  version "4.0.0"
@@ -3049,6 +3207,13 @@
  dependencies:
    brace-expansion "^1.1.7"
minimatch@^3.1.1:
  version "3.1.2"
  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
  dependencies:
    brace-expansion "^1.1.7"
minimatch@^9.0.2:
  version "9.0.3"
  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz"
@@ -3096,37 +3261,35 @@
  resolved "https://registry.npmmirror.com/moment/download/moment-2.29.1.tgz"
  integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
mqtt-packet@^6.8.0:
mqtt-packet@^6.0.0:
  version "6.10.0"
  resolved "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz"
  resolved "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz#c8b507832c4152e3e511c0efa104ae4a64cd418f"
  integrity sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==
  dependencies:
    bl "^4.0.2"
    debug "^4.1.1"
    process-nextick-args "^2.0.1"
mqtt@^4.3.7:
  version "4.3.7"
  resolved "https://registry.npmmirror.com/mqtt/-/mqtt-4.3.7.tgz"
  integrity sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==
mqtt@4.0.1:
  version "4.0.1"
  resolved "https://registry.npmmirror.com/mqtt/-/mqtt-4.0.1.tgz#8bffa46b2b365a459c0bedd90267645418d0f2a5"
  integrity sha512-sDvB/wI8e3YSSdIxJ74M81lQTFXxg1uFM5/irpQL+IH9crQiW90R69YOnk7UGj9xCqoXBBRPr8fqnkzQUKRYgg==
  dependencies:
    base64-js "^1.3.0"
    commist "^1.0.0"
    concat-stream "^2.0.0"
    debug "^4.1.1"
    duplexify "^4.1.1"
    help-me "^3.0.0"
    concat-stream "^1.6.2"
    end-of-stream "^1.4.1"
    es6-map "^0.1.5"
    help-me "^1.0.1"
    inherits "^2.0.3"
    lru-cache "^6.0.0"
    minimist "^1.2.5"
    mqtt-packet "^6.8.0"
    number-allocator "^1.0.9"
    minimist "^1.2.0"
    mqtt-packet "^6.0.0"
    pump "^3.0.0"
    readable-stream "^3.6.0"
    readable-stream "^2.3.6"
    reinterval "^1.1.0"
    rfdc "^1.3.0"
    split2 "^3.1.0"
    ws "^7.5.5"
    xtend "^4.0.2"
    websocket-stream "^5.1.2"
    xtend "^4.0.1"
ms@2.0.0:
  version "2.0.0"
@@ -3180,6 +3343,11 @@
  resolved "https://registry.nlark.com/natural-compare/download/natural-compare-1.4.0.tgz"
  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
next-tick@^1.1.0:
  version "1.1.0"
  resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
no-case@^3.0.4:
  version "3.0.4"
  resolved "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz?cache=0&sync_timestamp=1606867308811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.4.tgz"
@@ -3209,14 +3377,6 @@
  integrity sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=
  dependencies:
    boolbase "^1.0.0"
number-allocator@^1.0.9:
  version "1.0.14"
  resolved "https://registry.npmmirror.com/number-allocator/-/number-allocator-1.0.14.tgz"
  integrity sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==
  dependencies:
    debug "^4.3.1"
    js-sdsl "4.3.0"
object-assign@^4, object-assign@^4.1.0:
  version "4.1.1"
@@ -3306,6 +3466,13 @@
    type-check "^0.4.0"
    word-wrap "^1.2.3"
ordered-read-streams@^1.0.0:
  version "1.0.1"
  resolved "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
  integrity sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==
  dependencies:
    readable-stream "^2.0.1"
p-limit@^1.1.0:
  version "1.3.0"
  resolved "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz"
@@ -3370,6 +3537,11 @@
  dependencies:
    dot-case "^3.0.4"
    tslib "^2.0.3"
path-dirname@^1.0.0:
  version "1.0.2"
  resolved "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
  integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==
path-exists@^3.0.0:
  version "3.0.0"
@@ -3520,6 +3692,14 @@
    "@types/node" ">=13.7.0"
    long "^5.0.0"
pump@^2.0.0:
  version "2.0.1"
  resolved "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
  integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
  dependencies:
    end-of-stream "^1.1.0"
    once "^1.3.1"
pump@^3.0.0:
  version "3.0.0"
  resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz"
@@ -3527,6 +3707,15 @@
  dependencies:
    end-of-stream "^1.1.0"
    once "^1.3.1"
pumpify@^1.3.5:
  version "1.5.1"
  resolved "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
  integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
  dependencies:
    duplexify "^3.6.0"
    inherits "^2.0.3"
    pump "^2.0.0"
punycode@^2.1.0:
  version "2.1.1"
@@ -3573,6 +3762,19 @@
  dependencies:
    quickselect "^2.0.0"
"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
  version "2.3.8"
  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.3"
    isarray "~1.0.0"
    process-nextick-args "~2.0.0"
    safe-buffer "~5.1.1"
    string_decoder "~1.1.1"
    util-deprecate "~1.0.1"
readable-stream@^2.0.2, readable-stream@~2.3.6:
  version "2.3.7"
  resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz"
@@ -3586,7 +3788,7 @@
    string_decoder "~1.1.1"
    util-deprecate "~1.0.1"
readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0:
  version "3.6.0"
  resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz"
  integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg=
@@ -3629,6 +3831,11 @@
  version "1.1.0"
  resolved "https://registry.npmmirror.com/reinterval/-/reinterval-1.1.0.tgz"
  integrity sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==
remove-trailing-separator@^1.0.1:
  version "1.1.0"
  resolved "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
  integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
repeat-element@^1.1.2:
  version "1.1.4"
@@ -3679,11 +3886,6 @@
  resolved "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz"
  integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=
rfdc@^1.3.0:
  version "1.3.0"
  resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz"
  integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
rimraf@2:
  version "2.7.1"
  resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz"
@@ -3729,15 +3931,15 @@
  dependencies:
    queue-microtask "^1.2.2"
safe-buffer@^5.1.2, safe-buffer@~5.2.0:
  version "5.2.1"
  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz"
  integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
  version "5.1.2"
  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz"
  integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
safe-buffer@~5.2.0:
  version "5.2.1"
  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz"
  integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
safe-regex@^1.1.0:
  version "1.1.0"
@@ -4162,6 +4364,30 @@
  resolved "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz"
  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
through2-filter@^3.0.0:
  version "3.0.0"
  resolved "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
  integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
  dependencies:
    through2 "~2.0.0"
    xtend "~4.0.0"
through2@^2.0.1, through2@~2.0.0:
  version "2.0.5"
  resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
  dependencies:
    readable-stream "~2.3.6"
    xtend "~4.0.1"
to-absolute-glob@^2.0.0:
  version "2.0.2"
  resolved "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
  integrity sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==
  dependencies:
    is-absolute "^1.0.0"
    is-negated-glob "^1.0.0"
to-fast-properties@^2.0.0:
  version "2.0.0"
  resolved "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418893613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz"
@@ -4265,6 +4491,16 @@
  resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz"
  integrity sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=
type@^1.0.1:
  version "1.2.0"
  resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.7.2:
  version "2.7.2"
  resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
  integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
typedarray@^0.0.6:
  version "0.0.6"
  resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz"
@@ -4280,6 +4516,11 @@
  resolved "https://registry.npmmirror.com/ufo/-/ufo-1.3.0.tgz"
  integrity sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==
ultron@~1.1.0:
  version "1.1.1"
  resolved "https://registry.npmmirror.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
  integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
unbox-primitive@^1.0.1:
  version "1.0.1"
  resolved "https://registry.npm.taobao.org/unbox-primitive/download/unbox-primitive-1.0.1.tgz?cache=0&sync_timestamp=1616706302651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funbox-primitive%2Fdownload%2Funbox-primitive-1.0.1.tgz"
@@ -4289,6 +4530,11 @@
    has-bigints "^1.0.1"
    has-symbols "^1.0.2"
    which-boxed-primitive "^1.0.2"
unc-path-regex@^0.1.2:
  version "0.1.2"
  resolved "https://registry.npmmirror.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
  integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==
unimport@^3.0.14:
  version "3.2.0"
@@ -4316,6 +4562,14 @@
    get-value "^2.0.6"
    is-extendable "^0.1.1"
    set-value "^2.0.1"
unique-stream@^2.0.2:
  version "2.3.1"
  resolved "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
  integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
  dependencies:
    json-stable-stringify-without-jsonify "^1.0.1"
    through2-filter "^3.0.0"
universalify@^2.0.0:
  version "2.0.0"
@@ -4608,6 +4862,18 @@
  resolved "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz"
  integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==
websocket-stream@^5.1.2:
  version "5.5.2"
  resolved "https://registry.npmmirror.com/websocket-stream/-/websocket-stream-5.5.2.tgz#49d87083d96839f0648f5513bbddd581f496b8a2"
  integrity sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==
  dependencies:
    duplexify "^3.5.1"
    inherits "^2.0.1"
    readable-stream "^2.3.3"
    safe-buffer "^5.1.2"
    ws "^3.2.0"
    xtend "^4.0.0"
which-boxed-primitive@^1.0.2:
  version "1.0.2"
  resolved "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz"
@@ -4636,14 +4902,18 @@
  resolved "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz"
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
ws@^7.5.5:
  version "7.5.9"
  resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz"
  integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
ws@^3.2.0:
  version "3.3.3"
  resolved "https://registry.npmmirror.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
  integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
  dependencies:
    async-limiter "~1.0.0"
    safe-buffer "~5.1.0"
    ultron "~1.1.0"
xtend@^4.0.2:
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
  version "4.0.2"
  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz"
  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
yallist@^4.0.0: