| .eslintignore | ●●●●● patch | view | raw | blame | history | |
| .eslintrc.js | ●●●●● patch | view | raw | blame | history | |
| .gitignore | ●●●●● patch | view | raw | blame | history | |
| .gitignore copy | ●●●●● patch | view | raw | blame | history | |
| .npmrc | ●●●●● patch | view | raw | blame | history | |
| README.md | ●●●●● patch | view | raw | blame | history | |
| env/.env | ●●●●● patch | view | raw | blame | history | |
| env/.env.production | ●●●●● patch | view | raw | blame | history | |
| env/.env.stag | ●●●●● patch | view | raw | blame | history | |
| index.html | ●●●●● patch | view | raw | blame | history | |
| package-lock.json | ●●●●● patch | view | raw | blame | history | |
| package.json | ●●●●● patch | view | raw | blame | history | |
| public/favicon.ico | patch | view | raw | blame | history | |
| src/App.vue | ●●●●● patch | view | raw | blame | history | |
| src/antd.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/http.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/http/config.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/http/request.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/http/type.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/layer.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/manage.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/media.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/pilot-bridge.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/wayline.ts | ●●●●● patch | view | raw | blame | history | |
| src/api/websocket.ts | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/check.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/dji-logo-vector.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/layer.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/media.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/pin-19be6b.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/pin-212121.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/pin-2d8cf0.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/pin-b620e0.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/pin-e23c39.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/pin-ffbb00.svg | ●●●●● patch | view | raw | blame | history | |
| src/assets/icons/tsa.svg | ●●●●● patch | view | raw | blame | history | |
| src/components/GMap.vue | ●●●●● patch | view | raw | blame | history | |
| src/components/LayersTree.vue | ●●●●● patch | view | raw | blame | history | |
| src/components/MediaPanel.vue | ●●●●● patch | view | raw | blame | history | |
| src/components/svgIcon.vue | ●●●●● patch | view | raw | blame | history | |
| src/components/wayline-panel.vue | ●●●●● patch | view | raw | blame | history | |
| src/constants/index.ts | ●●●●● patch | view | raw | blame | history | |
| src/constants/map.ts | ●●●●● patch | view | raw | blame | history | |
| src/constants/mock-layers.ts | ●●●●● patch | view | raw | blame | history | |
| src/env.d.ts | ●●●●● patch | view | raw | blame | history | |
| src/hooks/use-g-map-cover.ts | ●●●●● patch | view | raw | blame | history | |
| src/hooks/use-g-map.ts | ●●●●● patch | view | raw | blame | history | |
| src/hooks/use-mouse-tool.ts | ●●●●● patch | view | raw | blame | history | |
| src/main.ts | ●●●●● patch | view | raw | blame | history | |
| src/pages/elements/elements.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/page-pilot/pilot-home.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/page-pilot/pilot-index.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/page-pilot/pilot-liveshare.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/page-pilot/pilot-media.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/index.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/layer.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/livestream-agora.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/livestream-others.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/livestream.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/media.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/tsa.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/projects/wayline.vue | ●●●●● patch | view | raw | blame | history | |
| src/pages/project-app/sidebar.vue | ●●●●● patch | view | raw | blame | history | |
| src/plugins/svgBuilder.ts | ●●●●● patch | view | raw | blame | history | |
| src/root.ts | ●●●●● patch | view | raw | blame | history | |
| src/router/index.ts | ●●●●● patch | view | raw | blame | history | |
| src/shims-vue.d.ts | ●●●●● patch | view | raw | blame | history | |
| src/store/index.ts | ●●●●● patch | view | raw | blame | history | |
| src/styles/common.scss | ●●●●● patch | view | raw | blame | history | |
| src/styles/flex.style.scss | ●●●●● patch | view | raw | blame | history | |
| src/styles/fonts.scss | ●●●●● patch | view | raw | blame | history | |
| src/styles/index.scss | ●●●●● patch | view | raw | blame | history | |
| src/styles/reset.scss | ●●●●● patch | view | raw | blame | history | |
| src/styles/variables.scss | ●●●●● patch | view | raw | blame | history | |
| src/types/enums.ts | ●●●●● patch | view | raw | blame | history | |
| src/types/index.ts | ●●●●● patch | view | raw | blame | history | |
| src/types/map-enum.ts | ●●●●● patch | view | raw | blame | history | |
| src/types/map.d.ts | ●●●●● patch | view | raw | blame | history | |
| src/types/mapLayer.ts | ●●●●● patch | view | raw | blame | history | |
| src/use-common-components.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/data-process.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/genjson.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/layer-tree.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/logger.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/map-layer-utils.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/storage.ts | ●●●●● patch | view | raw | blame | history | |
| src/utils/uuid.ts | ●●●●● patch | view | raw | blame | history | |
| src/vendors/coordtransform.js | ●●●●● patch | view | raw | blame | history | |
| src/vendors/jswebrtc.min.js | ●●●●● patch | view | raw | blame | history | |
| src/vite-env.d.ts | ●●●●● patch | view | raw | blame | history | |
| tsconfig.json | ●●●●● patch | view | raw | blame | history | |
| vite.config.ts | ●●●●● patch | view | raw | blame | history | |
| yarn.lock | ●●●●● patch | view | raw | blame | history |
.eslintignore
New file @@ -0,0 +1 @@ /src/vendors/** .eslintrc.js
New file @@ -0,0 +1,22 @@ module.exports = { env: { browser: true, commonjs: true, es2021: true, node: true }, extends: ['standard', 'plugin:vue/vue3-essential'], parserOptions: { ecmaVersion: 12, parser: '@typescript-eslint/parser' }, plugins: ['vue', '@typescript-eslint'], rules: { 'comma-dangle': 'off', 'import/no-absolute-path': 'off', 'no-unused-vars': 'off', camelcase: 'off', 'no-redeclare': 'off', 'vue/no-unused-components': 'off' } } .gitignore
New file @@ -0,0 +1,25 @@ node_modules .DS_Store dist dist-ssr *.local node_modules/ # Log files npm-debug.log* yarn-debug.log* yarn-error.log* # Editor directories and files .idea # .vscode *.suo *.ntvs* *.njsproj *.sln *.sw? .history /coverage /backup node_modules .gitignore copy
New file @@ -0,0 +1,5 @@ node_modules .DS_Store dist dist-ssr *.local .npmrc
New file @@ -0,0 +1 @@ registry=https://registry.npm.taobao.org/ README.md
New file @@ -0,0 +1,2 @@ # VUE3 全系统选用 script setup 模式 env/.env
New file @@ -0,0 +1,2 @@ VITE_APP_ENVIRONMENT=DEV VITE_APP_APIGATEWAY_BACKEND_HOST='' env/.env.production
New file @@ -0,0 +1,2 @@ VITE_APP_ENVIRONMENT=production VITE_APP_APIGATEWAY_BACKEND_HOST='' env/.env.stag
New file @@ -0,0 +1,2 @@ VITE_APP_ENVIRONMENT=STAG VITE_APP_APIGATEWAY_BACKEND_HOST='' index.html
New file @@ -0,0 +1,13 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>demo-web</title> </head> <body> <div id="demo-app"></div> <script type="module" src="/src/main.ts"></script> </body> </html> package-lock.json
New file Diff too large package.json
New file @@ -0,0 +1,87 @@ { "name": "demo-web", "version": "0.0.1", "scripts": { "serve": "vite", "build:test": "vite build --mode stag", "build": "vite build", "preview": "vite preview", "lint": "eslint --fix" }, "dependencies": { "@amap/amap-jsapi-loader": "^1.0.1", "@ant-design/icons-vue": "^6.0.1", "@vitejs/plugin-legacy": "^1.6.2", "agora-rtc-sdk-ng": "latest", "ant-design-vue": "^2.2.8", "axios": "^0.21.1", "query-string": "^7.0.1", "reconnecting-websocket": "^4.4.0", "vconsole": "^3.8.1", "vite-plugin-components": "^0.13.3", "vite-plugin-importer": "^0.2.5", "vite-plugin-optimize-persist": "^0.1.2", "vite-plugin-package-config": "^0.1.1", "vue": "^3.2.26", "vue-cookies": "^1.7.4", "vue-i18n": "^9.1.6", "vue-router": "4", "vuex": "^4.0.2" }, "devDependencies": { "@types/node": "^16.3.2", "@types/urlencode": "^1.1.2", "@typescript-eslint/eslint-plugin": "^5.8.1", "@typescript-eslint/parser": "^5.8.1", "@vitejs/plugin-vue": "^1.2.4", "@vue/compiler-sfc": "^3.0.5", "eslint": "^7.30.0", "eslint-config-standard": "^16.0.3", "eslint-plugin-import": "^2.23.4", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^5.1.0", "eslint-plugin-vue": "^7.13.0", "rollup-plugin-external-globals": "^0.6.1", "sass": "^1.35.1", "typescript": "^4.5.4", "vite": "^2.4.0", "vite-plugin-eslint": "^1.3.0", "vite-plugin-style-import": "^1.0.1", "vite-plugin-svg-icons": "^1.0.5", "vite-plugin-vconsole": "^1.1.0", "vue-tsc": "^0.0.24" }, "license": "ISC", "vite": { "optimizeDeps": { "include": [ "@amap/amap-jsapi-loader", "@ant-design/icons-vue", "@vue/reactivity", "agora-rtc-sdk-ng", "ant-design-vue", "ant-design-vue/es", "ant-design-vue/es/button/style/css", "ant-design-vue/es/divider/style/css", "ant-design-vue/es/drawer/style/css", "ant-design-vue/es/form/style/css", "ant-design-vue/es/image/style/css", "ant-design-vue/es/input/style/css", "ant-design-vue/es/message/style/css", "ant-design-vue/es/modal/style/css", "ant-design-vue/es/radio/style/css", "ant-design-vue/es/select/style/css", "ant-design-vue/es/switch/style/css", "ant-design-vue/es/table/style/css", "ant-design-vue/es/tooltip/style/css", "ant-design-vue/es/tree/style/css", "axios", "reconnecting-websocket", "vconsole", "vue", "vue-router", "vuex" ] } } } public/favicon.ico
src/App.vue
New file @@ -0,0 +1,34 @@ <template> <div id="demo-app" class="demo-app"> <router-view /> <!-- <div class="map-wrapper"> <GMap/> </div> --> </div> </template> <script lang="ts"> import { computed, defineComponent, ref } from 'vue' import { useMyStore } from './store' import GMap from '/@/components/GMap.vue' export default defineComponent({ name: 'App', components: { GMap }, setup () { const store = useMyStore() return {} } }) </script> <style lang="scss" scoped> .demo-app { width: 100%; height: 100%; .map-wrapper { height: 100%; width: 100%; } } </style> src/antd.ts
New file @@ -0,0 +1,13 @@ // import Icon from '@ant-design/icons-vue' import * as antDesign from 'ant-design-vue' import 'ant-design-vue/dist/antd.css' import { App } from 'vue' import svgIcon from '/@/components/svgIcon.vue' export const antComponents = { install (app: App): void { app.use(antDesign) // app.component('Icon', Icon) app.component('svg-icon', svgIcon) } } src/api/http.ts
New file @@ -0,0 +1,42 @@ /** * 职责声明: * 1.提供一个 单一的 axios 实例(方面进行统一拦截) * 2.允许调用方定制自己的配置(例如拦截器等),而不影响其他实例 * * 暴露 API: * 1.一个统一的 axios 实例: singleAxiosInstance(绑定了统一的拦截器) * 2.创建 axios 实例的方法 createAxiosInstance,并在参数中允许配置是否绑定统一拦截器 * 3.对外暴露统一拦截器绑定方案,允许外界进行定制: bindCommonRequestInterceptors、bindCommonResponseInterceptors */ import Axios, { AxiosInstance, AxiosRequestConfig } from 'axios' // 统一的 request 拦截器 export function bindCommonRequestInterceptors (instance: AxiosInstance): void { instance.interceptors.request.use(config => { return config }) } // Unified response interceptor export function bindCommonResponseInterceptors (instance: AxiosInstance): void { instance.interceptors.response.use(config => { return config }, err => { return Promise.reject(err) }) } export function createAxiosInstance (config?: AxiosRequestConfig, commonInterceptorConf: { request?: boolean, response?: boolean } = {}): AxiosInstance { const instance = Axios.create(config) // Binding a unified interceptor, binding by default commonInterceptorConf.request !== false && bindCommonRequestInterceptors(instance) commonInterceptorConf.response !== false && bindCommonResponseInterceptors(instance) return instance } const singleAxios = createAxiosInstance({}, { request: true, response: false }) export default singleAxios src/api/http/config.ts
New file @@ -0,0 +1,20 @@ export const CURRENT_CONFIG = { baseURL: 'Please enter the backend access address prefix.', // This url must end with "/". Example: 'http://192.168.1.1:6789/cloud/' websocketURL: 'Please enter the WebSocket access address.', // Example: 'ws://192.168.1.1:6789/api/v1/ws' rtmpURL: 'Please enter the rtmp access address.', // Example: 'rtmp://192.168.1.1/live/' gb28181Para: 'serverIP=Please enter the server ip.&serverPort=Please enter the server port.&serverID=Please enter the server id.' + '&agentID=Please enter the agent id.&agentPassword=Please enter the agent password' + '&localPort=Please enter the local port.&channel=Please enter the channel.', rtspPara: 'userName=Please enter the username.&password=Please enter the password&port=Please enter the port.', amapKey: 'Please enter the amap key.', agoraAPPID: 'Please enter the agora app id.', agoraToken: 'Please enter the agora token.', agoraChannel: 'Please enter the agora channel.', appId: 'Please enter the app id.', // You need to go to the development website to apply. appKey: 'Please enter the app key.', // You need to go to the development website to apply. appLicense: 'Please enter the app license.' // You need to go to the development website to apply. } src/api/http/request.ts
New file @@ -0,0 +1,64 @@ import axios from 'axios' import { uuidv4 } from '/@/utils/uuid' import { CURRENT_CONFIG } from './config' export * from './type' const REQUEST_ID = 'X-Request-Id' function getAuthToken () { return localStorage.getItem('x-auth-token') } const instance = axios.create({ // withCredentials: true, headers: { 'Content-Type': 'application/json', }, // timeout: 12000, }) instance.interceptors.request.use( config => { config.headers['X-Auth-Token'] = getAuthToken() // config.headers[REQUEST_ID] = uuidv4() config.baseURL = CURRENT_CONFIG.baseURL return config }, error => { return Promise.reject(error) }, ) instance.interceptors.response.use( response => response, err => { const requestId = err?.config?.headers && err?.config?.headers[REQUEST_ID] console.info('') if (requestId) { console.info(REQUEST_ID, ':', requestId) } console.info('url: ', err?.config?.url, `【${err?.config?.method}】 \n>>>> err: `, err) let description = '-' if (err.response?.data && err.response.data.message) { description = err.response.data.message } if (err.response?.data && err.response.data.result) { description = err.response.data.result.message } // @See: https://github.com/axios/axios/issues/383 if (!err.response || !err.response.status) { console.log('The network is abnormal, please check the network and try again') } else if (err.response?.status !== 200) { console.log(`ERROR_CODE: ${err.response?.status}`) } if (err.response?.status === 403) { // window.location.href = '/' } if (err.response?.status === 401) { console.log(err.response) } return Promise.reject(err) }, ) export default instance src/api/http/type.ts
New file @@ -0,0 +1,38 @@ export interface IResult { code: number; message: string; } export interface IPage { page: number; total: number; page_size: number; } export interface IListWorkspaceResponse<T> { code: number; message: string; data: { list: T[]; pagination: IPage; }; } // Workspace export interface IWorkspaceResponse<T> { [x: string]: number; code: number; data: T; message: string; } export type IStatus = 'WAITING' | 'DOING' | 'SUCCESS' | 'FAILED'; export interface CommonListResponse<T> extends IResult { data: { list: T[]; pagination: IPage; }; } export interface CommonResponse<T> extends IResult { data: T } src/api/layer.ts
New file @@ -0,0 +1,52 @@ import request, { IWorkspaceResponse } from '/@/api/http/request' import { mapLayers } from '/@/constants/mock-layers' import { elementGroupsReq, PostElementsBody, PutElementsBody } from '/@/types/mapLayer' const PREFIX = '/map/api/v1' const workspace_id = localStorage.getItem('workspace-id') type UnknownResponse = Promise<IWorkspaceResponse<unknown>> // get elements group // export const getLayers = async (reqParams: elementGroupsReq): UnknownResponse => { // const url = `${PREFIX}/workspaces/${workspace_id}/element_groups` // const result = await request.get(url, { // params: { // group_id: reqParams.groupId, // is_distributed: reqParams.isDistributed // }, // }) // return result.data // } export const getLayers = async (reqParams: elementGroupsReq): UnknownResponse => { return mapLayers } // Get elements groups request export const getElementGroupsReq = async (body: elementGroupsReq): Promise<IWorkspaceResponse<any>> => { const url = `${PREFIX}/workspaces/` + workspace_id + '/element-groups' const result = await request.get(url, body) return result.data } // add element export const postElementsReq = async (pid: string, body: PostElementsBody): Promise<IWorkspaceResponse<{ id: string }>> => { const url = `${PREFIX}/workspaces/` + workspace_id + `/element-groups/${pid}/elements` const result = await request.post(url, body) return result.data } // Update map element request export const updateElementsReq = async (id: string, body: PutElementsBody): Promise<IWorkspaceResponse<{ id: string }>> => { const url = `${PREFIX}/workspaces/` + workspace_id + `/elements/${id}` const result = await request.put(url, body) return result.data } // Delete map element export const deleteElementReq = async (id: string, body: {}): Promise<any> => { const url = `${PREFIX}/workspaces/` + workspace_id + `/elements/${id}` const result = await request.delete(url, body) return result.data } // Delete layer elements export const deleteLayerEleReq = async (id: string, body: {}): Promise<any> => { const url = `${PREFIX}/workspaces/` + workspace_id + `/element-groups/${id}/elements` const result = await request.delete(url, body) return result.data } src/api/manage.ts
New file @@ -0,0 +1,62 @@ import request, { IWorkspaceResponse } from '/@/api/http/request' const HTTP_PREFIX = '/manage/api/v1' // login interface loginBody { username: string, password: string } export const login = async function (body: loginBody): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/login` const result = await request.post(url, body) return result.data } // Refresh Token export const refreshToken = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/token/refresh` const result = await request.post(url, body) return result.data } // Get Platform Info export const getPlatformInfo = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/workspaces/current` const result = await request.get(url, body) return result.data } // Get User Info export const getUserInfo = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/users/current` const result = await request.get(url, body) return result.data } // Get Device Topo export const getDeviceTopo = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/devices/devices` const result = await request.get(url, body) return result.data } // Get Livestream Capacity export const getLiveCapacity = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/live/capacity` const result = await request.get(url, body) return result.data } // Start Livestream export const startLivestream = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/live/streams/start` const result = await request.post(url, body) return result.data } // Stop Livestream export const stopLivestream = async function (body: {}): Promise<IWorkspaceResponse<any>> { const url = `${HTTP_PREFIX}/live/streams/stop` const result = await request.post(url, body) return result.data } src/api/media.ts
New file @@ -0,0 +1,9 @@ import request from '/@/api/http/request' const HTTP_PREFIX = '/media/api/v1' // Get Media Files export const getMediaFiles = async function (wid: string, body: {}): Promise<any> { const url = `${HTTP_PREFIX}/files/${wid}/files` const result = await request.get(url, body) return result.data } src/api/pilot-bridge.ts
New file @@ -0,0 +1,183 @@ import { getRoot } from '/@/root' const root = getRoot() const components = new Map() declare let window:any interface JsResponse{ code:number, message:string, data:{} } export default { init () { components.set('thing', { host: '', connectCallback: '', username: '', password: '' }) components.set('liveshare', { videoPublishType: 'video-demand-aux-manual', // video-on-demand、video-by-manual、video-demand-aux-manual statusCallback: '' }) components.set('map', { userName: '', elementPreName: '' }) components.set('ws', { host: '', token: '', connectCallback: '' }) components.set('api', { host: '', token: '' }) components.set('tsa', { }) components.set('media', { autoUploadPhoto: true, // 是否自动上传图片, 非必需 autoUploadPhotoType: 1, // 自动上传的照片类型,0:原图, 1:缩略图, 非必需 autoUploadVideo: true // 是否自动上传视频, 非必需 }) components.set('mission', { }) }, getComponentParam (key:string) { return components.get(key) }, setComponentParam (key:string, value:any) { components.set(key, value) }, loadComponent (name:string, param:any):string { return window.djiBridge.platformLoadComponent(name, JSON.stringify(param)) }, unloadComponent (name:string) :string { return window.djiBridge.platformUnloadComponent(name) }, isComponentLoaded (module:string):string { return window.djiBridge.platformIsComponentLoaded(module) }, setWorkspaceId (uuid:string):string { return window.djiBridge.platformSetWorkspaceId(uuid) }, setPlatformMessage (platformName:string, title:string, desc:string):string { return window.djiBridge.platformSetInformation(platformName, title, desc) }, getRemoteControllerSN () :string { return window.djiBridge.platformGetRemoteControllerSN() }, getAircraftSN ():string { return window.djiBridge.platformGetAircraftSN() }, stopwebview ():string { return window.djiBridge.platformStopSelf() }, getToken () :string { const res:string = this.isComponentLoaded('api') const resObj = JSON.parse(res) console.log('api load status:', resObj) if (resObj.data === true) { const tokenRes = JSON.parse(window.djiBridge.apiGetToken()) return tokenRes.data } else { console.warn('warning: not api component loaded!!') return '' } }, setToken (token:string):string { return window.djiBridge.apiSetToken(token) }, setLogEncryptKey (key:string):string { return window.djiBridge.platformSetLogEncryptKey(key) }, clearLogEncryptKey ():string { return window.djiBridge.platformClearLogEncryptKey() }, getLogPath ():string { return window.djiBridge.platformGetLogPath() }, platformVerifyLicense (appId:string, appKey:string, appLicense:string):string { return window.djiBridge.platformVerifyLicense(appId, appKey, appLicense) }, isPlatformVerifySuccess ():string { return window.djiBridge.platformIsVerified() }, // liveshare /** * * @param type * video-on-demand: 服务器点播,依赖于thing模块,具体的点播命令参见设备物模型的直播服务 * video-by-manual:手动点播,配置好直播类型参数之后,在图传页面可修改直播参数,停止直播 * video-demand-aux-manual: 混合模式,支持服务器点播,以及图传页面修改直播参数,停止直播 */ setVideoPublishType (type:string):string { return window.djiBridge.liveshareSetVideoPublishType(type) }, /** * * @returns * type: liveshare type, 0:unknown, 1:agora, 2:rtmp, 3:rtsp, 4:gb28181 */ getLiveshareConfig () { return window.djiBridge.liveshareGetConfig() }, setLiveshareConfig (type:number, params:string):string { return window.djiBridge.liveshareSetConfig(type, params) }, setLiveshareStatusCallback (callbackFunc:string) :string { return window.djiBridge.liveshareSetStatusCallback(callbackFunc) }, getLiveshareStatus () { return window.djiBridge.liveshareGetStatus() }, startLiveshare ():string { return window.djiBridge.liveshareStartLive() }, stopLiveshare ():string { return window.djiBridge.liveshareStopLive() }, // media setAutoUploadPhoto (auto:boolean):string { return window.djiBridge.mediaSetAutoUploadPhoto(auto) }, getAutoUploadPhoto () { return window.djiBridge.mediaGetAutoUploadPhoto() }, setUploadPhotoType (type:number):string { return window.djiBridge.mediaSetUploadPhotoType(type) }, getUploadPhotoType () { return window.djiBridge.mediaGetUploadPhotoType() }, setAutoUploadVideo (auto:boolean):string { return window.djiBridge.mediaSetAutoUploadVideo(auto) }, getAutoUploadVideo () { return window.djiBridge.mediaGetAutoUploadVideo() }, setDownloadOwner (rcIndex:number):string { return window.djiBridge.mediaSetDownloadOwner(rcIndex) }, getDownloadOwner () { return window.djiBridge.mediaGetDownloadOwner() }, onBackClickReg () { window.djiBridge.onBackClick = () => { if (root.$router.currentRoute.value.path === '/pilot-home') { console.log(root.$router.currentRoute.value.path) return false } else { console.log(root.$router.currentRoute.value.path) history.go(-1) return true } } } } src/api/wayline.ts
New file @@ -0,0 +1,9 @@ import request from '/@/api/http/request' const HTTP_PREFIX = '/wayline/api/v1' // Get Wayline Files export const getWaylineFiles = async function (wid: string, body: {}): Promise<any> { const url = `${HTTP_PREFIX}/workspaces/${wid}/waylines?` + 'order_by=' + body.order_by + '&page=' + body.page + '&page_size=' + body.page_size const result = await request.get(url) return result.data } src/api/websocket.ts
New file @@ -0,0 +1,30 @@ import ReconnectingWebSocket from 'reconnecting-websocket' import { CURRENT_CONFIG as config } from '/@/api/http/config' let socket = {} export default { init (getMsgFunc) { const token = localStorage.getItem('x-auth-token') const wspath = config.websocketURL + '?x-auth-token=' + escape(token) socket = new ReconnectingWebSocket(wspath) socket.onopen = this.onOpen socket.onerror = this.onError socket.onmessage = getMsgFunc socket.onclose = this.onClose return socket }, onOpen () { console.log('ws opened') }, onError (err) { console.error(err) }, onClose () { console.log('ws closed') }, sendMsg (data) { this.socket.send(data) } } src/assets/icons/check.svg
New file @@ -0,0 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>ic/panel/checkbox_active</title> <desc>Created with Sketch.</desc> <g id="ic/panel/checkbox_active" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Group-3" fill="#FFFFFF"> <polygon id="Shape-Copy" points="11.2103387 4.23529412 6.47425817 8.97137463 4.50089127 6.99800776 2.82352941 8.65563591 4.79689632 10.6290028 6.37558979 12.2076964 6.47425817 12.286631 12.8877005 5.8929223"></polygon> </g> </g> </svg> src/assets/icons/dji-logo-vector.svg
New file @@ -0,0 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="layer" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 652 652" style="enable-background:new 0 0 652 652;" xml:space="preserve"> <style type="text/css"> .st0{fill:#241F1F;} </style> <g> <path class="st0" d="M464.9,404.7l44.3-183.9h-95l-40.5,164.9c-5.9,32.2-40.4,47.2-64.9,47.6h-67.3l-22.9,66.3h141.5 C395,499.6,446.5,481.8,464.9,404.7"/> <path class="st0" d="M265.5,339.9L310.1,153h97.8l-50.8,212.6c-9.8,41.1-40.3,50.9-68.5,50.9H63.2c-24.8,0-45.6-10.6-34.4-58 l20.3-84.8c10.3-43,42.3-52.9,65.4-52.9h157.3l-12.7,53h-80.3c-11.8,0-18.3,2.6-21.6,16.3l-13,54.1c-4.6,19.4,2.2,20.8,16.4,20.8 h73.6C247.8,365.2,259.6,364.3,265.5,339.9"/> <polygon class="st0" points="530.7,220.9 484.6,416.5 579.7,416.5 625.7,220.9 "/> </g> </svg> src/assets/icons/layer.svg
New file @@ -0,0 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs><path d="m14.042 0 14.043 8.055-5.128 2.941 5.128 2.941-5.127 2.94 5.127 2.942-14.043 8.055L0 19.82l5.126-2.942L0 13.937l5.127-2.941L0 8.056 14.042 0zM7.638 18.318l-2.614 1.5 9.018 5.175 9.017-5.174-2.614-1.5-6.403 3.674-6.404-3.675zm0-5.882-2.615 1.5 9.02 5.175 9.017-5.173-2.615-1.501-6.403 3.674-6.404-3.675zm6.404-9.554L5.024 8.056l9.018 5.174 9.017-5.174-9.017-5.174z" id="layer_a"></path></defs><g transform="translate(2 2)" fill-rule="evenodd"><mask id="layer_b"><use xlink:href="#layer_a"></use></mask><use fill-rule="nonzero" xlink:href="#layer_a"></use><g mask="url(#layer_b)"><path d="M-19-20h68v68h-68z"></path></g></g> </svg> src/assets/icons/media.svg
New file @@ -0,0 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs><path d="M29.5 4v21.5h-4v2H3V8h3V4h23.5zM10.553 18.859 5.5 22.399V25H23v-6.088l-7.011 5.108-5.436-5.161zM27 6.5H8.499L8.5 8h17v15H27V6.5zm-4 4H5.5v8.847l5.293-3.707 5.406 5.133L23 15.819V10.5zm-6.362 1.956a2 2 0 1 1 0 4 2 2 0 0 1 0-4z" id="media_a"></path></defs><g fill-rule="evenodd"><mask id="media_b"><use xlink:href="#media_a"></use></mask><use fill-rule="nonzero" xlink:href="#media_a"></use><g mask="url(#media_b)"><path d="M-17-18h68v68h-68z"></path></g></g> </svg> src/assets/icons/pin-19be6b.svg
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>2图标/24px/pin</title> <desc>Created with Sketch.</desc> <defs> <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path> </defs> <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#19BE6B" fill-rule="evenodd"> <g id="编组" transform="translate(5.000000, 2.000000)"> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <use id="形状" fill="#19BE6B" fill-rule="nonzero" xlink:href="#path-1"></use> <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#19BE6B"> <g transform="translate(-26.000000, -26.000000)"> <rect x="0" y="0" width="68" height="68"></rect> </g> </g> </g> </g> </svg> src/assets/icons/pin-212121.svg
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>2图标/24px/pin</title> <desc>Created with Sketch.</desc> <defs> <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path> </defs> <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#212121" fill-rule="evenodd"> <g id="编组" transform="translate(5.000000, 2.000000)"> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <use id="形状" fill="#212121" fill-rule="nonzero" xlink:href="#path-1"></use> <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#212121"> <g transform="translate(-26.000000, -26.000000)"> <rect x="0" y="0" width="68" height="68"></rect> </g> </g> </g> </g> </svg> src/assets/icons/pin-2d8cf0.svg
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>2图标/24px/pin</title> <desc>Created with Sketch.</desc> <defs> <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path> </defs> <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#2D8CF0" fill-rule="evenodd"> <g id="编组" transform="translate(5.000000, 2.000000)"> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <use id="形状" fill="#2D8CF0" fill-rule="nonzero" xlink:href="#path-1"></use> <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#2D8CF0"> <g transform="translate(-26.000000, -26.000000)"> <rect x="0" y="0" width="68" height="68"></rect> </g> </g> </g> </g> </svg> src/assets/icons/pin-b620e0.svg
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>2图标/24px/pin</title> <desc>Created with Sketch.</desc> <defs> <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path> </defs> <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#b620e0" fill-rule="evenodd"> <g id="编组" transform="translate(5.000000, 2.000000)"> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <use id="形状" fill="#b620e0" fill-rule="nonzero" xlink:href="#path-1"></use> <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#b620e0"> <g transform="translate(-26.000000, -26.000000)"> <rect x="0" y="0" width="68" height="68"></rect> </g> </g> </g> </g> </svg> src/assets/icons/pin-e23c39.svg
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>2图标/24px/pin</title> <desc>Created with Sketch.</desc> <defs> <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path> </defs> <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#e23c39" fill-rule="evenodd"> <g id="编组" transform="translate(5.000000, 2.000000)"> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <use id="形状" fill="#e23c39" fill-rule="nonzero" xlink:href="#path-1"></use> <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#e23c39"> <g transform="translate(-26.000000, -26.000000)"> <rect x="0" y="0" width="68" height="68"></rect> </g> </g> </g> </g> </svg> src/assets/icons/pin-ffbb00.svg
New file @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 61.2 (89653) - https://sketch.com --> <title>2图标/24px/pin</title> <desc>Created with Sketch.</desc> <defs> <path d="M6.56239716,0 L13.1247943,9.89949494 L6.56239716,19.7989899 L0,9.89949494 L6.56239716,0 Z M6.56239716,3.61897251 L2.39965953,9.89878783 L6.56239716,16.1786032 L10.7251348,9.89878783 L6.56239716,3.61897251 Z" id="path-1"></path> </defs> <g id="2图标//24px/pin" stroke="none" stroke-width="1" fill="#FFBB00" fill-rule="evenodd"> <g id="编组" transform="translate(5.000000, 2.000000)"> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <use id="形状" fill="#FFBB00" fill-rule="nonzero" xlink:href="#path-1"></use> <g id="1颜色/ic色/nor" mask="url(#mask-2)" fill="#FFBB00"> <g transform="translate(-26.000000, -26.000000)"> <rect x="0" y="0" width="68" height="68"></rect> </g> </g> </g> </g> </svg> src/assets/icons/tsa.svg
New file @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <path d="m19.87 10.131-1.01 2.518-.86-.012v-.006l-7.045.002-.068.004a1.75 1.75 0 0 0-1.614 1.737l.006.144.656 8.388h4.804l-1.005 2.5h-6.11l-.168-2.137H.544l-.53-6.896a4.25 4.25 0 0 1 4.03-4.598l.206-.005h2.48a4.25 4.25 0 0 1 .873.09 4.238 4.238 0 0 1 3.089-1.716l.166-.01.166-.003h8.846zm1.106 1.7 5.476 13.566-5.454-1.781-5.497 1.78 5.475-13.565zm.008 4.028.011 6.18H21l2.854.931-2.87-7.111zm-14.21-1.588L4.25 14.27a1.75 1.75 0 0 0-1.75 1.75l.007.153.352 4.597 4.401-.001-.473-6.056a4.3 4.3 0 0 1-.012-.442zM6.193 3.748a3.25 3.25 0 1 1 0 6.5 3.25 3.25 0 0 1 0-6.5zM14.3 0a4.25 4.25 0 1 1 0 8.5 4.25 4.25 0 0 1 0-8.5zM6.192 5.748a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5zM14.3 2a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5z" id="team_a"> </path> </defs> <g transform="translate(3 3)" fill-rule="evenodd"> <mask id="team_b"> <use xlink:href="#team_a"></use> </mask> <use fill-rule="nonzero" xlink:href="#team_a"></use> <g mask="url(#team_b)"><path d="M-20-21h68v68h-68z"></path> </g></g> </svg> src/components/GMap.vue
New file @@ -0,0 +1,311 @@ <template> <div class="g-map-wrapper"> <div id="g-container" :style="{ width: '100%', height: '100%' }" /> <div class="g-action-panle" :style="{ right: drawVisible ? '316px' : '16px' }" > <div class="g-action-item" @click="draw('pin', true)"> <a-button type="primary">PIN</a-button> </div> <div class="g-action-item" @click="draw('polyline', true)"> <a-button type="primary">Line</a-button> </div> <div class="g-action-item" @click="draw('polygon', true)"> <a-button type="primary">Poly</a-button> </div> <div v-if="mouseMode" class="g-action-item" @click="draw('off', false)"> <a-button type="primary" danger>X</a-button> </div> </div> </div> </template> <script lang="ts"> import { computed, defineComponent, onMounted, reactive, ref, watch } from 'vue' import { generateLineContent, generatePointContent, generatePolyContent } from '../utils/map-layer-utils' import { postElementsReq } from '/@/api/layer' import { MapDoodleType, MapElementEnum } from '/@/constants/map' import { useGMapManage } from '/@/hooks/use-g-map' import { useGMapCover } from '/@/hooks/use-g-map-cover' import { useMouseTool } from '/@/hooks/use-mouse-tool' import { getApp } from '/@/root' import { useMyStore } from '/@/store' import { GeojsonCoordinate } from '/@/types/map' import { MapDoodleEnum } from '/@/types/map-enum' import { PostElementsBody } from '/@/types/mapLayer' import { uuidv4 } from '/@/utils/uuid' import { gcj02towgs84, wgs84togcj02 } from '/@/vendors/coordtransform' export default defineComponent({ name: 'GMap', props: {}, setup () { const useMouseToolHook = useMouseTool() const useGMapManageHook = useGMapManage() const mouseMode = ref(false) const store = useMyStore() const state = reactive({ currentType: '', coverIndex: 0 }) const shareId = computed(() => { return store.state.layerBaseInfo.share }) const defaultId = computed(() => { return store.state.layerBaseInfo.default }) const drawVisible = computed(() => { return store.state.drawVisible }) watch( () => store.state.wsEvent, newData => { const useGMapCoverHook = useGMapCover() const event = newData let exist = false if (Object.keys(event.mapElementCreat).length !== 0) { console.log(event.mapElementCreat) const ele = event.mapElementCreat store.state.Layers.forEach(layer => { layer.elements.forEach(e => { if (e.id === ele.id) { exist = true console.log('true') } }) }) if (exist === false) { setLayers({ id: ele.id, name: ele.name, resource: ele.resource }) updateCoordinates('wgs84-gcj02', ele) useGMapCoverHook.init2DPin( ele.name, ele.resource.content.geometry.coordinates, ele.resource.content.properties.color, { id: ele.id, name: ele.name } ) } store.state.wsEvent.mapElementCreat = {} } if (Object.keys(event.mapElementUpdate).length !== 0) { console.log(event.mapElementUpdate) console.log('该功能还未实现,请开发商自己增加') store.state.wsEvent.mapElementUpdate = {} } if (Object.keys(event.mapElementDelete).length !== 0) { console.log(event.mapElementDelete) console.log('该功能还未实现,请开发商自己增加') store.state.wsEvent.mapElementDelete = {} } }, { deep: true } ) function draw (type: MapDoodleType, bool: boolean) { state.currentType = type useMouseToolHook.mouseTool(type, getDrawCallback) mouseMode.value = bool } onMounted(() => { const app = getApp() useGMapManageHook.globalPropertiesConfig(app) }) function getDrawCallback ({ obj }) { switch (state.currentType) { case MapDoodleEnum.PIN: postPinPositionResource(obj) break case MapDoodleEnum.POLYLINE: postPolylineResource(obj) break case MapDoodleEnum.POLYGON: postPolygonResource(obj) break default: break } } async function postPinPositionResource (obj) { const req = getPinPositionResource(obj) setLayers(req) updateCoordinates('gcj02-wgs84', req) const result = await postElementsReq(shareId.value, req) obj.setExtData({ id: req.id, name: req.name }) store.state.coverList.push(obj) // console.log(store.state.coverList) } async function postPolylineResource (obj) { const req = getPolylineResource(obj) setLayers(req) updateCoordinates('gcj02-wgs84', req) const result = await postElementsReq(shareId.value, req) obj.setExtData({ id: req.id, name: req.name }) store.state.coverList.push(obj) // console.log(store.state.coverList) } async function postPolygonResource (obj) { const req = getPoygonResource(obj) setLayers(req) updateCoordinates('gcj02-wgs84', req) const result = await postElementsReq(shareId.value, req) obj.setExtData({ id: req.id, name: req.name }) store.state.coverList.push(obj) // console.log(store.state.coverList) } function getPinPositionResource (obj) { const position = obj.getPosition() const resource = generatePointContent(position) const name = obj._originOpts.title const id = uuidv4() return { id, name, resource } } function getPolylineResource (obj) { const path = obj.getPath() const resource = generateLineContent(path) const { name, id } = getBaseInfo(obj._opts) return { id, name, resource } } function getPoygonResource (obj) { const path = obj.getPath() const resource = generatePolyContent(path) const { name, id } = getBaseInfo(obj._opts) return { id, name, resource } } function getBaseInfo (obj) { const name = obj.title const id = uuidv4() return { name, id } } function setLayers (resource: PostElementsBody) { const layers = store.state.Layers const layer = layers.find(item => item.id.includes(shareId.value)) // layer.id = 'private_layer' + uuidv4() // layer?.elements.push(resource) if (layer?.elements) { ;(layer?.elements as any[]).push(resource) } console.log('layers', layers) store.commit('SET_LAYER_INFO', layers) } function updateCoordinates (transformType: string, element: any) { const geoType = element.resource?.content.geometry.type const type = element.resource?.type as number if (element.resource) { if (MapElementEnum.PIN === type) { const coordinates = element.resource?.content.geometry .coordinates as GeojsonCoordinate if (transformType === 'wgs84-gcj02') { const transResult = wgs84togcj02( coordinates[0], coordinates[1] ) as GeojsonCoordinate element.resource.content.geometry.coordinates = transResult } else if (transformType === 'gcj02-wgs84') { const transResult = gcj02towgs84( coordinates[0], coordinates[1] ) as GeojsonCoordinate element.resource.content.geometry.coordinates = transResult } } else if (MapElementEnum.LINE === type && geoType === 'LineString') { const coordinates = element.resource?.content.geometry .coordinates as GeojsonCoordinate[] if (transformType === 'wgs84-gcj02') { coordinates.forEach(coordinate => { coordinate = wgs84togcj02( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } else if (transformType === 'gcj02-wgs84') { coordinates.forEach(coordinate => { coordinate = gcj02towgs84( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } element.resource.content.geometry.coordinates = coordinates } else if (MapElementEnum.LINE === type && geoType === 'Polygon') { const coordinates = element.resource?.content.geometry .coordinates[0] as GeojsonCoordinate[] if (transformType === 'wgs84-gcj02') { coordinates.forEach(coordinate => { coordinate = wgs84togcj02( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } else if (transformType === 'gcj02-wgs84') { coordinates.forEach(coordinate => { coordinate = gcj02towgs84( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } element.resource.content.geometry.coordinates = [coordinates] } } } return { draw, mouseMode, drawVisible } } }) </script> <style lang="scss" scoped> .g-map-wrapper { height: 100%; width: 100%; .g-action-panle { position: absolute; top: 16px; right: 16px; .g-action-item { padding-top: 8px; } } } </style> <style lang="scss"> .amap-logo { opacity: 0; } .amap-copyright { opacity: 0; } </style> src/components/LayersTree.vue
New file @@ -0,0 +1,217 @@ <template> <span> <a-tree draggable :defaultExpandAll="true" class="device-map-layers" @drop="onDrop" v-bind="$attrs" > <a-tree-node :title="layer.name" :id="layer.id" v-for="layer in getTreeData" :key="layer.id" > <!-- <template #title> {{layer.name}} </template> --> <template v-if="layer.elements"> <a-tree-node v-for="resource in layer.elements" :id="getLayerTreeKey('resource', resource.id)" :key="getLayerTreeKey('resource', resource.id)" > <template #title> {{ resource.name }} </template> </a-tree-node> </template> </a-tree-node> </a-tree> </span> </template> <script lang="ts" setup> import { computed, defineProps, PropType, reactive } from 'vue' import { useMyStore } from '/@/store' import { DropEvent, mapLayer } from '/@/types/mapLayer' import { getLayerTreeKey } from '/@/utils/layer-tree' const store = useMyStore() const props = defineProps({ layerData: Array as PropType<mapLayer[]> }) const state = reactive({ checkedKeys: [] as string[], expandedKeys: [] as string[] }) const getTreeData = computed(() => { // console.log('props.treeData', JSON.parse(JSON.stringify(props.layerData))) return JSON.parse(JSON.stringify(props.layerData)) }) const shareId = computed(() => { return store.state.layerBaseInfo.share }) const defaultId = computed(() => { return store.state.layerBaseInfo.default }) async function onDrop ({ node, dragNode, dropPosition, dropToGap }: DropEvent) { let _treeData = props.layerData || [] let dragKey = dragNode.eventKey dragKey = dragKey.replaceAll('resource__', '') const dropPos = node.pos.split('-') let dropKey = node.eventKey.includes(shareId.value) || node.eventKey.includes(defaultId.value) ? node.eventKey : node.$parent.eventKey if (!dragKey || !dropKey) return dropKey = dropKey.replaceAll('resource__', '') const loop = (data: mapLayer[], key: string, callback: Function) => { data.forEach((item, index, arr) => { if (item.id === key) { return callback(item, index, arr) } if (item.elements) { return loop(item.elements, key, callback) } }) } const data = [..._treeData] as mapLayer[] // Find dragObject let dragObj = {} as mapLayer loop(data, dragKey, (item: mapLayer, index: number, arr: mapLayer[]) => { arr.splice(index, 1) dragObj = item }) if (!dropToGap) { // Drop on the content loop(data, dropKey, (item: mapLayer) => { item.elements = item.elements || [] // where to insert 示例添加到尾部,可以是随意位置 item.elements.push(dragObj) }) } _treeData = data // console.log('_treeData', _treeData) } </script> <style lang="scss"> $antPrefix: 'ant'; .device-map-layers.#{$antPrefix}-tree { color: #fff; .#{$antPrefix}-tree-checkbox:not(.#{$antPrefix}-tree-checkbox-checked) .#{$antPrefix}-tree-checkbox-inner { background-color: unset; } .anticon { font-size: 16px; } // 第一个层级的 li,有左边距 16px > li { padding-left: 16px; padding-right: 16px; } li { display: flex; flex-wrap: wrap; align-items: center; padding-top: 0; padding-bottom: 0; &:first-child { padding-top: 4px; } &.#{$antPrefix}-tree-treenode-disabled > .#{$antPrefix}-tree-node-content-wrapper { height: 20px; span { color: #fff; } } > ul { width: 100%; } .#{$antPrefix}-tree-switcher { z-index: 1; display: flex; align-items: center; justify-content: center; } .#{$antPrefix}-tree-checkbox { z-index: 1; } .#{$antPrefix}-tree-checkbox:hover::after, .#{$antPrefix}-tree-checkbox-wrapper:hover .#{$antPrefix}-tree-checkbox::after { visibility: collapse; } .#{$antPrefix}-tree-title { display: block; } .#{$antPrefix}-tree-node-content-wrapper { color: #fff; width: calc(100% - 46px); flex: 1; box-sizing: content-box; height: 20px; min-width: 0; // 解决文字溢出不会省略的问题 padding-right: 0; &:not([draggable='true']) { border-top: 2px transparent solid; border-bottom: 2px transparent solid; } &:hover { background-color: transparent; } > span { &::before { // position: absolute; // right: 0; // left: 0; height: 28px; transition: all 0.3s; content: ''; } // 进度条组件需要相对最外层定位,进度条组件的position不能设置为relative > *:not(.progress-wrapper) { position: relative; z-index: 1; } } &.#{$antPrefix}-tree-node-selected { background-color: transparent; color: #2d8cf0; > span { &::before { background-color: #4f4f4f; } } } } } span.#{$antPrefix}-tree-switcher.#{$antPrefix}-tree-switcher_open .#{$antPrefix}-tree-switcher-icon { transform: rotate(0deg) !important; } span.#{$antPrefix}-tree-switcher.#{$antPrefix}-tree-switcher_close .#{$antPrefix}-tree-switcher-icon { transform: rotate(0deg) !important; } } </style> src/components/MediaPanel.vue
New file @@ -0,0 +1,92 @@ <template> <div class="media-panel-wrapper"> <div class="header">Media</div> <a-button type="primary" style="margin-top:20px" @click="onRefresh" >Refresh</a-button > <a-table class="media-table" :columns="columns" :data-source="data"> <template #name="{ text, record }"> <a :href="record.preview_url">{{ text }}</a> </template> <template #action> <span class="action-area"> action </span> </template> </a-table> </div> </template> <script setup lang="ts"> import { ref } from '@vue/reactivity' import { getMediaFiles } from '/@/api/media' const columns = [ { title: 'FileName', dataIndex: 'name', key: 'name', slots: { customRender: 'name' } }, { title: 'FileSize', dataIndex: 'size', key: 'size' }, { title: 'PayloadType', dataIndex: 'payload_type', key: 'payload_type', ellipsis: true }, { title: 'Action', key: 'action', slots: { customRender: 'action' } } ] const data = ref([ { key: '1', name: 'name1', size: 32, payload_type: 'PM320_DUAL', preview_url: '' } ]) const onRefresh = async () => { const wid = localStorage.getItem('workspace-id') data.value = [] const index = 1 const res = await getMediaFiles(wid, {}) res.data.forEach(ele => { data.value.push({ key: index.toString(), name: ele.file_name }) }) console.log(res) } </script> <style lang="scss" scoped> .media-panel-wrapper { width: 100%; .media-table { background: #fff; margin-top: 32px; } .header { width: 100%; height: 60px; background: #fff; padding: 16px 24px; font-size: 20px; text-align: start; color: #000; } .action-area { color: $primary; cursor: pointer; } } </style> src/components/svgIcon.vue
New file @@ -0,0 +1,42 @@ <template> <svg :class="svgClass" :aria-hidden="true" :style="{color: color, width:computedWidth, height:computedWidth}"> <use :xlink:href="iconName" :fill="color"/> </svg> </template> <script setup> import { defineProps, computed } from 'vue' const props = defineProps({ name: { type: String, required: true }, color: { type: String, default: '' }, size: { type: Number, }, }) const iconName = computed(() => `#icon-${props.name}`) const svgClass = computed(() => { console.log(props.name, 'props.name') if (props.name) { return `svg-icon icon-${props.name}` } return 'svg-icon' }) const computedWidth = computed(() => { const result = props.width || props.size return result ? result + 'px' : '1em' }) </script> <style lang='scss'> .svg-icon { width: 1em; height: 1em; fill: currentColor; vertical-align: middle; } </style> src/components/wayline-panel.vue
New file @@ -0,0 +1,122 @@ <template> <div class="panel-wrapper"> <div class="header">Wayline Library</div> <a-button type="primary" style="margin-top:20px" @click="onRefresh" >Refresh</a-button > <a-table class="table" :columns="columns" :data-source="data"> <template #name="{ text, record }"> <a :href="record.preview_url">{{ text }}</a> </template> <template #action> <span class="action-area"> action </span> </template> </a-table> </div> </template> <script setup lang="ts"> import { ref } from '@vue/reactivity' import { onMounted } from 'vue' import { getWaylineFiles } from '/@/api/wayline' const columns = [ { title: 'FileName', dataIndex: 'name', key: 'name', slots: { customRender: 'name' } }, { title: 'TemplateType', dataIndex: 'template_type', key: 'template_type' }, { title: 'Favorited', dataIndex: 'favorite', key: 'favorite' }, { title: 'DroneType', dataIndex: 'drone_type', key: 'drone_type' }, { title: 'PayloadType', dataIndex: 'payload_type', key: 'payload_type' }, { title: 'User', dataIndex: 'user', key: 'user' }, { title: 'Action', key: 'action', slots: { customRender: 'action' } } ] const data = ref([ { key: '1', name: 'name1', template_type: '0', drone_type: '0-60-0', payload_type: 'PM320_DUAL', user: 'pilot', favorited: 'true' } ]) onMounted(() => { onRefresh() }) const onRefresh = async () => { const wid: string = localStorage.getItem('workspace-id') data.value = [] const index = 1 const res = await getWaylineFiles(wid, { page: 1, // 页数 page_size: 9, // 每页大小 order_by: 'update_time desc' // 排序, xxx_column_desc, xxx_column_asc, xxx_column(default asc) }) console.log(res) res.data.list.forEach(ele => { data.value.push({ key: index.toString(), name: ele.name, template_type: ele.template_types[0], drone_type: ele.drone_model_key, payload_type: ele.payload_model_keys[0], user: ele.user_name, favorite: ele.favorited.toString() }) }) console.log('wayline files:', data.value) } </script> <style lang="scss" scoped> .panel-wrapper { width: 100%; .table { background: #fff; margin-top: 32px; } .header { width: 100%; height: 60px; background: #fff; padding: 16px 24px; font-size: 20px; text-align: start; color: #000; } .action-area { color: $primary; cursor: pointer; } } </style> src/constants/index.ts
New file @@ -0,0 +1,19 @@ export const AMapConfig = { key: '26d54da6733de88435c68d1a2e88b682', version: '2.0', plugins: [ 'AMap.Scale', 'AMap.ToolBar', 'AMap.ControlBar', 'AMap.ElasticMarker', 'AMap.MapType', 'AMap.Geocoder', 'AMap.CircleEditor', 'AMap.PolygonEditor', 'AMap.PolylineEditor', 'AMap.PolyEditor', 'AMap.RangingTool', 'AMap.Weather', 'AMap.MouseTool' ] } src/constants/map.ts
New file @@ -0,0 +1,23 @@ export enum MapElementColor { Blue = '#2D8CF0', Green = '#19BE6B', Yellow = '#FFBB00', Red = '#E23C39', Orange = '#B620E0', Default = '#212121' } export const MapElementDefaultColor = MapElementColor.Default export enum MapDoodleColor { PinColor = '#2D8CF0', PolylineColor = '#3366FF', PolygonColor = '#FF33FF' } export enum MapElementEnum { PIN = 0, LINE = 1, POLY = 2 } export type MapDoodleType = 'pin' | 'polyline' | 'polygon' | 'off' src/constants/mock-layers.ts
New file @@ -0,0 +1,138 @@ export const mapLayers = { code: 0, message: 'success', data: { list: [{ id: 'private_layer', name: 'Private Layer', order: 0, is_distributed: false, type: 1, is_lock: false, create_time: 1634268707424, elements: [{ id: 'b2370d29-be65-42b0-9224-4d816e86dc64', name: 'xuejia n. 1', order: 0, status: 1, display: 1, resource: { content: { type: 'Feature', properties: { color: '#2D8CF0' }, geometry: { type: 'Polygon', coordinates: [ [ [114.156671, 38.468249], [114.139517, 37.372177], [115.52899, 37.712212] ] ] } }, type: 4, user_name: 'xuejia n.', user_id: '1402914943455727616' }, update_time: 1636966336566, create_time: 1636966325700, elevation_load_status: 0, icon: 'area' }, { id: '768e9fcd-121f-47a6-96b9-f1aee27d32f0', name: 'xuejia n. 1', order: 0, status: 1, display: 1, resource: { content: { type: 'Feature', properties: { color: '#2D8CF0' }, geometry: { type: 'LineString', coordinates: [ [116.263962, 40.234929], [116.503006, 40.237026], [116.335465, 40.155206], [116.541458, 40.12371] ] } }, type: 4, user_name: 'xuejia n.', user_id: '1402914943455727616' }, update_time: 1636966322636, create_time: 1636966316803, elevation_load_status: 0, icon: 'line' }, { id: '4e741a76-3600-4af5-ace8-d805e7cd31fa', name: 'xuejia n. 2', order: 0, status: 1, display: 1, resource: { content: { type: 'Feature', properties: { color: '#2D8CF0', clampToGround: true }, geometry: { type: 'Point', coordinates: [116.098223, 39.976538, 104] } }, type: 6, user_name: 'xuejia n.', user_id: '1402914943455727616' }, update_time: 1636966305229, create_time: 1636966305229, elevation_load_status: 0, icon: 'pin' }, { id: 'efff2b5d-de22-4d48-8d92-4f53170668f6', name: 'xuejia n. 1', order: 0, status: 1, display: 1, resource: { content: { type: 'Feature', properties: { color: '#19BE6B', clampToGround: true }, geometry: { type: 'Point', coordinates: [113.35367028239645, 23.755194000519843, 22] } }, type: 6, user_name: 'xuejia n.', user_id: '1402914943455727616' }, update_time: 1636966304432, create_time: 1636966299455, elevation_load_status: 0, icon: 'pin' }] }, { id: 'share_layer', name: 'Share Layer', order: 0, is_distributed: true, type: 2, is_lock: false, create_time: 1634268707414, elements: [] }] } } src/env.d.ts
New file @@ -0,0 +1,9 @@ // Environment variable definition // https://cn.vitejs.dev/guide/env-and-mode.html#env-files interface ImportMetaEnv { VITE_APP_ENVIRONMENT: 'DEV' | 'STAG' | 'UAT' | 'PROD', // api gateway VITE_APP_APIGATEWAY_BACKEND_HOST: string // More environment variables... } src/hooks/use-g-map-cover.ts
New file @@ -0,0 +1,144 @@ import pin19be6b from '/@/assets/icons/pin-19be6b.svg' import pin212121 from '/@/assets/icons/pin-212121.svg' import pin2d8cf0 from '/@/assets/icons/pin-2d8cf0.svg' import pinb620e0 from '/@/assets/icons/pin-b620e0.svg' import pine23c39 from '/@/assets/icons/pin-e23c39.svg' import pineffbb00 from '/@/assets/icons/pin-ffbb00.svg' import { getRoot } from '/@/root' import rootStore from '/@/store' import { GeojsonCoordinate } from '/@/types/map' export function useGMapCover () { const root = getRoot() const AMap = root.$aMapObj const normalColor = '#2D8CF0' const store = rootStore const coverList = store.state.coverList function AddCoverToMap (cover :any) { root.$aMap.add(cover) coverList.push(cover) // console.log('coverList:', store.state.coverList) } function getPinIcon (color?:string) { // console.log('color', color) const colorObj: { [key: number| string]: any } = { '2d8cf0': pin2d8cf0, '19be6b': pin19be6b, 212121: pin212121, b620e0: pinb620e0, e23c39: pine23c39, ffbb00: pineffbb00, } const iconName = (color?.replaceAll('#', '') || '').toLocaleLowerCase() return new AMap.Icon({ // size: new AMap.Size(40, 50), image: colorObj[iconName], // imageOffset: new AMap.Pixel(0, -60), // imageSize: new AMap.Size(40, 50) }) } function init2DPin (name: string, coordinates:GeojsonCoordinate, color?:string, data?:{}) { console.log(name, coordinates[0], coordinates[1], color, data) const pin = new AMap.Marker({ position: new AMap.LngLat(coordinates[0], coordinates[1]), title: name, icon: getPinIcon(color), // strokeColor: color || normalColor, // fillColor: color || normalColor, extData: data }) // console.log('coordinates pin', pin) AddCoverToMap(pin) } function AddOverlayGroup (overlayGroup) { root.$aMap.add(overlayGroup) coverList.push(overlayGroup) } function initPolyline (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) { const path = [] as GeojsonCoordinate[] coordinates.forEach(coordinate => { path.push(new AMap.LngLat(coordinate[0], coordinate[1])) }) const polyline = new AMap.Polyline({ path: path, strokeColor: color || normalColor, strokeOpacity: 1, strokeWeight: 2, strokeStyle: 'solid', extData: data // draggable: true, }) AddOverlayGroup(polyline) } function initPolygon (name: string, coordinates:GeojsonCoordinate[], color?:string, data?:{}) { const path = [] as GeojsonCoordinate[] coordinates.forEach(coordinate => { path.push(new AMap.LngLat(coordinate[0], coordinate[1])) }) // console.log('Polygon', path) const Polygon = new AMap.Polygon({ path: path, strokeOpacity: 1, strokeWeight: 2, fillColor: color || normalColor, fillOpacity: 0.4, // draggable: true, strokeColor: color || normalColor, extData: data }) AddOverlayGroup(Polygon) } function removeCoverFromMap (id:string) { for (let i = 0; i < coverList.length; i++) { const ele = coverList[i] // console.log(ele) const extdata = ele?.getExtData() if (extdata?.id === id) { console.log(extdata) root.$aMap.remove(ele) coverList.slice(i, 1) break } } } function getElementFromMap (id:string) { // console.log('start', new Date().getTime()) const ele = coverList.find(ele => ele?.getExtData().id === id) // console.log('end', new Date().getTime()) return ele // coverList.forEach((ele:any) => { // const extdata = ele?.getExtData() // // console.log(extdata) // if (extdata?.id === id) { // return ele // } // }) } function updatePinElement (id:string, name: string, coordinates:GeojsonCoordinate, color?:string) { const element = getElementFromMap(id) as any if (element) { const icon = getPinIcon(color) element.setPosition(new AMap.LngLat(coordinates[0], coordinates[1])) element.setIcon(icon) element.setTitle(name) } else { // console.log('into init PIN') init2DPin(name, coordinates, color, { id: id, name: name }) } } return { init2DPin, initPolyline, initPolygon, removeCoverFromMap, getElementFromMap, updatePinElement } } src/hooks/use-g-map.ts
New file @@ -0,0 +1,34 @@ import AMapLoader from '@amap/amap-jsapi-loader' import { App, reactive } from 'vue' import { AMapConfig } from '/@/constants/index' export function useGMapManage () { const state = reactive({ mapEntity: null, mapObj: null, mouseTool: null, }) async function initMap (container: string, app:App) { AMapLoader.load({ ...AMapConfig }).then((AMap) => { state.mapObj = AMap state.mapEntity = new AMap.Map(container, { center: [113.935913, 22.525335], zoom: 15 }) state.mouseTool = new AMap.MouseTool(state.mapEntity) app.config.globalProperties.$aMap = state.mapEntity app.config.globalProperties.$aMapObj = state.mapObj app.config.globalProperties.$mouseTool = state.mouseTool }).catch(e => { console.log(e) }) } function globalPropertiesConfig (app:App) { initMap('g-container', app) } return { globalPropertiesConfig, } } src/hooks/use-mouse-tool.ts
New file @@ -0,0 +1,71 @@ import { reactive } from 'vue' import pin2d8cf0 from '/@/assets/icons/pin-2d8cf0.svg' import { MapDoodleType } from '/@/constants/map' import { getRoot } from '/@/root' import { MapDoodleEnum } from '/@/types/map-enum' export function useMouseTool () { const root = getRoot() const AMap = root.$aMapObj const state = reactive({ pinNum: 0, polylineNum: 0, PolygonNum: 0, currentType: '', }) function drawPin (type:MapDoodleType, getDrawCallback:Function) { root?.$mouseTool.marker({ title: type + state.pinNum, icon: pin2d8cf0, }) state.pinNum++ root?.$mouseTool.on('draw', getDrawCallback) } function drawPolyline (type:MapDoodleType, getDrawCallback:Function) { root?.$mouseTool.polyline({ strokeColor: '#2d8cf0', strokeOpacity: 1, strokeWeight: 2, strokeStyle: 'solid', draggable: true, title: type + state.polylineNum++ }) root?.$mouseTool.on('draw', getDrawCallback) } function drawPolygon (type:MapDoodleType, getDrawCallback:Function) { root?.$mouseTool.polygon({ strokeColor: '#2d8cf0', strokeOpacity: 1, strokeWeight: 2, fillColor: '#1791fc', fillOpacity: 0.4, draggable: true, title: type + state.PolygonNum++ }) root?.$mouseTool.on('draw', getDrawCallback) } function drawOff (type:MapDoodleType) { root?.$mouseTool.close() root?.$mouseTool.off('draw') } function mouseTool (type: MapDoodleType, getDrawCallback: Function) { state.currentType = type switch (type) { case MapDoodleEnum.PIN: drawPin(type, getDrawCallback) break case MapDoodleEnum.POLYLINE: drawPolyline(type, getDrawCallback) break case MapDoodleEnum.POLYGON: drawPolygon(type, getDrawCallback) break case MapDoodleEnum.Close: drawOff(type) break } } return { mouseTool } } src/main.ts
New file @@ -0,0 +1,14 @@ import App from './App.vue' import router from './router' import { antComponents } from './antd' import { CommonComponents } from './use-common-components' import 'virtual:svg-icons-register' import store, { storeKey } from './store' import { createInstance } from '/@/root' import '/@/styles/index.scss' const app = createInstance(App) app.use(store, storeKey) app.use(router) app.use(CommonComponents) app.use(antComponents) app.mount('#demo-app') src/pages/elements/elements.vue
New file @@ -0,0 +1,21 @@ <template> <div class="element-map-wrapper"> <GMap/> </div> </template> <script lang="ts"> import { defineComponent, onMounted } from 'vue' import GMap from '/@/components/GMap.vue' export default defineComponent({ name: 'Elements', components: { GMap }, setup () { return { } }, }) </script> <style lang="scss" scoped> </style> src/pages/page-pilot/pilot-home.vue
New file @@ -0,0 +1,150 @@ <template> <div class="page"> <div class="left flex-column flex-justify-start flex-align-center"> <p class="fz26 mb0 mt10" style="color: #727272"> {{ platformName }} </p> <p class="fz16 ml10 mb0 mt10" style="color: #2d8cf0"> status:{{ connect }} </p> <p class="fz32 mb0 mt50" style="color: #000000">{{ workspaceName }}</p> <a-button class="fz20 mt20 flex-column flex-justify-center flex-align-center" style="width: 30vw; height: 12vh;" type="default" @click="onOpen3rdApp" >Open 3rd Party APP</a-button > <a-button class="fz20" style="width: 15vw; height: 12vh; position: fixed; bottom: 7vh" type="primary" @click="onExit" >Quit</a-button > </div> <div class="right flex-column flex-justify-start flex-align-center"> <p class="fz24 mb0 mt10 ">Setting</p> <a-button class="mt10 fz16" style="width:90%" @click="onMediaSetting" >Media File Upload Setting</a-button > <a-button class="mt10 fz16" style="width:90%" @click="onLiveshareSetting" >Manual Live Share Setting</a-button > </div> </div> </template> <script lang="ts" setup> import { message } from 'ant-design-vue' import { onMounted, ref } from 'vue' import { CURRENT_CONFIG } from '/@/api/http/config' import { getPlatformInfo, getUserInfo } from '/@/api/manage' import apiPilot from '/@/api/pilot-bridge' import { getRoot } from '/@/root' const root = getRoot() const connect = ref('Disconnect') const platformName = ref('Unknown') const workspaceName = ref('Unknown') const workspaceDesc = ref('Unknown') const wsId = ref() onMounted(() => { apiPilot.init() const token = apiPilot.getToken() if (token) { getPlatformInfo({}).then(res => { console.log(res) platformName.value = res.data.platform_name workspaceName.value = res.data.workspace_name workspaceDesc.value = res.data.workspace_desc wsId.value = res.data.workspace_id apiPilot.setPlatformMessage( platformName.value, workspaceName.value, workspaceDesc.value ) apiPilot.setWorkspaceId(wsId.value) }) } if (JSON.parse(apiPilot.isComponentLoaded('thing')).data === false || token) { getUserInfo({}).then(res => { const param = { host: res.data.mqtt_addr, username: res.data.mqtt_username, password: res.data.mqtt_password, connectCallback: 'connectCallback' } apiPilot.setComponentParam('thing', param) apiPilot.loadComponent('thing', apiPilot.getComponentParam('thing')) }) } else { const connectState = JSON.parse(window.djiBridge.thingGetConnectState()) if (connectState.code === 0 && connectState.data) { connect.value = 'Connected' } else { connect.value = 'Disconnect' } } apiPilot.loadComponent('liveshare', apiPilot.getComponentParam('liveshare')) console.log('ws token:', token) apiPilot.setComponentParam('ws', { host: CURRENT_CONFIG.websocketURL, token: token }) apiPilot.loadComponent('ws', apiPilot.getComponentParam('ws')) apiPilot.setComponentParam('map', { userName: 'pilot1', elementPreName: 'PILOT' }) apiPilot.loadComponent('map', apiPilot.getComponentParam('map')) apiPilot.loadComponent('tsa', apiPilot.getComponentParam('tsa')) apiPilot.loadComponent('media', apiPilot.getComponentParam('media')) apiPilot.loadComponent('mission', {}) window.connectCallback = arg => { connectCallback(arg) } apiPilot.onBackClickReg() }) const connectCallback = (arg: any) => { console.info('into callback', arg) if (arg) { connect.value = 'Connected' window.djiBridge.mediaSetDownloadOwner(0) window.djiBridge.mediaSetUploadPhotoType(1) } else { connect.value = 'Disconnect' } } const onExit = async (e: any) => { apiPilot.stopwebview() } const onMediaSetting = async (e: any) => { root.$router.push('/pilot-media') } const onLiveshareSetting = async (e: any) => { root.$router.push('/pilot-liveshare') } const onOpen3rdApp = () => { window.open('mydjischeme://www.dji.com') } </script> <style lang="scss" scoped> @import '/@/styles/index.scss'; .page { display: flex; position: absolute; transition: width 0.2s ease; height: 100%; width: 100%; .left { width: 50%; border-right: red solid 2px; } .right { width: 100%; height: 100%; } } </style> src/pages/page-pilot/pilot-index.vue
New file @@ -0,0 +1,145 @@ <template> <div class="login flex-column flex-justify-center flex-align-center m0 b0"> <a-image style="width: 17vw; height: 10vw; margin-bottom: 50px" src="http://lofrev.net/wp-content/photos/2016/09/dji_logo_png.png" /> <p class="logo fz35 pb50">Pilot Cloud API Demo</p> <a-form layout="inline" :model="formState" class="flex-row flex-justify-center flex-align-center" > <a-form-item> <a-input v-model:value="formState.user" placeholder="Username"> <template #prefix ><UserOutlined style="color: rgba(0, 0, 0, 0.25)" /></template> </a-input> </a-form-item> <a-form-item> <a-input v-model:value="formState.password" type="password" placeholder="Password" > <template #prefix ><LockOutlined style="color: rgba(0, 0, 0, 0.25)" /></template> </a-input> </a-form-item> <a-form-item> <a-button class="m0" type="primary" html-type="submit" :disabled="formState.user === '' || formState.password === ''" @click="onSubmit" > Login </a-button> </a-form-item> </a-form> </div> </template> <script lang="ts" setup> import { LockOutlined, UserOutlined } from '@ant-design/icons-vue' import { message } from 'ant-design-vue' import { onMounted, reactive, UnwrapRef } from 'vue' import { CURRENT_CONFIG } from '/@/api/http/config' import { login, refreshToken } from '/@/api/manage' import apiPilot from '/@/api/pilot-bridge' import { getRoot } from '/@/root' interface FormState { user: string password: string } const root = getRoot() const formState: UnwrapRef<FormState> = reactive({ user: 'pilot', password: 'pilot123' }) let isVerified:any onMounted(async () => { const verifyLicense = JSON.parse(apiPilot.platformVerifyLicense(CURRENT_CONFIG.appId, CURRENT_CONFIG.appKey, CURRENT_CONFIG.appLicense)) const platformVerify = JSON.parse(apiPilot.isPlatformVerifySuccess()) isVerified = platformVerify.data if (platformVerify.data === true) { message.success('The license verification is successful.') } else { message.error('Filed to verify the license. message is ' + verifyLicense.data) return } const token = apiPilot.getToken() console.log('api token:', token) apiPilot.setPlatformMessage('Cloud Api Platform', '', '') if (token && token !== undefined) { await refreshToken({}) .then(res => { apiPilot.setComponentParam('api', { host: CURRENT_CONFIG.baseURL, token: res.data.access_token }) const jsres = JSON.parse( apiPilot.loadComponent('api', apiPilot.getComponentParam('api')) ) console.log('load api module status:', jsres) apiPilot.setToken(res.data.access_token) localStorage.setItem('x-auth-token', res.data.access_token) message.success('Login Success') root.$router.push('/pilot-home') }) .catch(err => { console.error(err) }) } }) const onSubmit = async (e: any) => { await login({ username: formState.user, password: formState.password }) .then(res => { if (!isVerified) { message.error('Please verify the license firstly.') return } console.log('login res:', res) if (res.code === 0) { apiPilot.setComponentParam('api', { host: CURRENT_CONFIG.baseURL, token: res.data.access_token }) const jsres = apiPilot.loadComponent( 'api', apiPilot.getComponentParam('api') ) console.log('load api module res:', jsres) apiPilot.setToken(res.data.access_token) localStorage.setItem('x-auth-token', res.data.access_token) localStorage.setItem('workspace-id', res.data.workspace_id) localStorage.setItem('username', res.data.username) message.success('Login Success') root.$router.push('/pilot-home') } }) .catch(err => { console.error(err) }) } </script> <style lang="scss" scoped> @import '/@/styles/index.scss'; .login { // background-color: $dark-highlight; height: 100vh; } .logo { color: $primary; } </style> src/pages/page-pilot/pilot-liveshare.vue
New file @@ -0,0 +1,202 @@ <template> <div class="width-100vw height-100vh flex-column flex-justify-start flex-align-start" > <div class="mt20 flex-row flex-align-center flex-justify-between" style="width: 100%" > <p class="ml10 mb0 fz16" style="color: black"> Select Video Publish Mode: </p> <a-select style="width: 200px" placeholder="Select Mode" @select="onPublishModeSelect" > <a-select-option v-for="item in publishModeList" :key="item.label" :value="item.value" > {{ item.label }} </a-select-option> </a-select> </div> <a-divider dashed class="mt10 mb0"></a-divider> <div class="flex-row flex-align-center flex-justify-between mt10" style="width: 100%" > <p class="ml10 mb0 fz16" style="color: black">Select Live Share Type:</p> <a-select style="width: 200px" placeholder="Select Live Type" @select="onLiveTypeSelect" > <a-select-option v-for="item in liveTypeList" :key="item.label" :value="item.value" > {{ item.label }} </a-select-option> </a-select> </div> <a-divider dashed class="mt10 mb0"></a-divider> <div class="flex-row flex-align-center flex-justify-center mt20" style="width: 100%" > <p>Live Share State: {{ liveState }}</p> </div> <div class="flex-row flex-align-center flex-justify-center mt20" style="width: 100%" > <a-button type="primary" @click="onPlay">Play</a-button> <a-button class="ml20" type="primary" @click="onGetConfig" >Get Config</a-button > <a-button class="ml20" type="primary" @click="onGetStatus" >Get Status</a-button > </div> </div> </template> <script lang="ts" setup> import { message } from 'ant-design-vue' import { onMounted, ref } from 'vue' import { CURRENT_CONFIG as config } from '/@/api/http/config' import apiPilot from '/@/api/pilot-bridge' import { getRoot } from '/@/root' const root = getRoot() const publishModeList = [ { value: 'video-on-demand', label: 'video-on-demand' }, { value: 'video-by-manual', label: 'video-by-manual' }, { value: 'video-demand-aux-manual', label: 'video-demand-aux-manual' } ] const liveTypeList = [ { value: 1, label: 'AGORA' }, { value: 2, label: 'RTMP' }, { value: 3, label: 'RTSP' }, { value: 4, label: 'GB28181' } ] const agoraParam = { uid: config.agoraAPPID, token: config.agoraToken, channelId: config.agoraChannel } const rtmpParam = { url: config.rtmpURL + '12345' } const rtspParam = { userName: 'dji-live-share', password: '12345678', port: '8554' } const gb28181Param = { serverIp: '114.55.103.238', serverPort: '5060', serverId: '34020000002000000001', agentId: '34020000001310000004', password: '12345678', agentPort: '7060', agentChannel: '34020000001310000004' } const liveState = ref<string>('STOP') const livetypeSelected = ref<number>(1) const publishModeSelected = ref<string>('video-demand-aux-manual') onMounted(() => { const status: any = apiPilot.getLiveshareStatus() console.log(status) // liveState.value = // status.status === 0 // ? 'Cannot connect to server' // : status.status === 1 // ? 'Connect to server' // : 'Playing' // console.log(liveState.value) }) const onLiveTypeSelect = (val: any) => { livetypeSelected.value = val message.info('set livetype:' + livetypeSelected.value, 5) } const onPublishModeSelect = (val: string) => { publishModeSelected.value = val message.info( 'set publish mode res:' + apiPilot.setVideoPublishType(publishModeSelected.value), 5 ) } const onPlay = () => { switch (livetypeSelected.value) { case 1: { message.info('agoraParam:' + JSON.stringify(agoraParam)) apiPilot.setLiveshareConfig(1, JSON.stringify(agoraParam)) apiPilot.startLiveshare() break } case 2: { message.info('rtmpParam:' + JSON.stringify(rtmpParam)) apiPilot.setLiveshareConfig(2, JSON.stringify(rtmpParam)) message.info(apiPilot.startLiveshare()) break } case 3: { message.info('rtspParam:' + JSON.stringify(rtspParam)) apiPilot.setLiveshareConfig(3, JSON.stringify(rtspParam)) apiPilot.startLiveshare() break } case 4: { message.info('gb28181Param:' + JSON.stringify(gb28181Param)) apiPilot.setLiveshareConfig(4, JSON.stringify(gb28181Param)) apiPilot.startLiveshare() break } } } const onGetStatus = () => { const status = apiPilot.getLiveshareStatus() message.info(status, 5) } const onGetConfig = () => { const status = apiPilot.getLiveshareConfig() message.info(status, 5) } </script> <style lang="scss" scoped> // @import '/@/styles/index.scss'; </style> src/pages/page-pilot/pilot-media.vue
New file @@ -0,0 +1,130 @@ <template> <div class="width-100vw height-100vh flex-column flex-justify-start flex-align-start" > <p class="fz16 ml10 mt10 mb10 color-text-title color-font-bold"> If Enabled, Pilot will upload photos or videos to the server automatically. </p> <div class="flex-row flex-align-center flex-justify-between" style="width: 100%" > <p class="ml10 mb0 fz16" style="color: black">Auto Upload Photos</p> <a-switch class="mt0 mb0" v-model:checked="enablePhotoUpload" @change="onPhotoUpload" ></a-switch> </div> <div class="flex-row flex-align-center flex-justify-between" style="width: 100%" > <a-radio-group class="mt10 ml20" v-if="enablePhotoUpload == true" v-model:value="photoType" defaultChecked="0" @change="onPhototype" > <a-radio :value="0">Original Photo</a-radio> <a-radio class="ml20" :value="1">Preview Photo</a-radio> </a-radio-group> </div> <a-divider dashed class="mt10 mb0"></a-divider> <div class="flex-row flex-align-center flex-justify-between mt10" style="width: 100%" > <p class="ml10 mb0 fz16" style="color: black">Auto Upload Video</p> <a-switch @change="onVideoUpload" v-model:checked="enableVideoUpload" ></a-switch> </div> <a-divider dashed class="mt10 mb0"></a-divider> <div class="flex-row flex-align-center flex-justify-between mt20" style="width: 100%" > <p class="ml10 mb0 fz16 color-font-bold" style="color: black"> Path for uploading media resources in dual-controller mode </p> <a-radio-group class="mt0 mb0" v-model:value="uploadPath" button-style="solid" @change="onUploadPath" > <a-radio-button :value="0">Mine</a-radio-button> <a-radio-button :value="1">Another</a-radio-button> </a-radio-group> </div> </div> </template> <script lang="ts" setup> import { message } from 'ant-design-vue' import { onMounted, ref } from 'vue' import apiPilot from '/@/api/pilot-bridge' import { getRoot } from '/@/root' const root = getRoot() const enablePhotoUpload = ref<boolean>(true) const enableVideoUpload = ref<boolean>(false) const photoType = ref<number>(1) const uploadPath = ref<number>(0) onMounted(() => { message.info('After setting, please use the physical button of the remote control to return, otherwise the setting is invalid.') enablePhotoUpload.value = apiPilot.getAutoUploadPhoto() === undefined ? true : apiPilot.getAutoUploadPhoto() enableVideoUpload.value = apiPilot.getAutoUploadVideo() === undefined ? false : apiPilot.getAutoUploadVideo() photoType.value = apiPilot.getUploadPhotoType() === undefined ? 1 : apiPilot.getUploadPhotoType() uploadPath.value = apiPilot.getDownloadOwner() === undefined ? 0 : apiPilot.getDownloadOwner() console.log( enablePhotoUpload.value, enableVideoUpload.value, photoType.value, uploadPath.value ) apiPilot.setComponentParam('media', { autoUploadPhoto: enablePhotoUpload.value, autoUploadPhotoType: photoType.value, autoUploadVideo: enableVideoUpload.value }) }) const onPhotoUpload = () => { apiPilot.setAutoUploadPhoto(enablePhotoUpload.value) } const onVideoUpload = () => { console.log(enableVideoUpload.value) apiPilot.setAutoUploadVideo(enableVideoUpload.value) } const onPhototype = () => { console.log(photoType.value) apiPilot.setUploadPhotoType(photoType.value) } const onUploadPath = (e: any) => { apiPilot.setDownloadOwner(uploadPath.value) } </script> <style lang="scss" scoped> // @import '/@/styles/index.scss'; </style> src/pages/project-app/index.vue
New file @@ -0,0 +1,208 @@ <template> <div v-if="showLogin" class="login flex-column flex-justify-center flex-align-center m0 b0" > <a-image style="width: 17vw; height: 10vw; margin-bottom: 50px" src="http://lofrev.net/wp-content/photos/2016/09/dji_logo_png.png" /> <p class="logo fz35 pb50">Cloud API Demo</p> <a-form layout="inline" :model="formState" class="flex-row flex-justify-center flex-align-center" > <a-form-item> <a-input v-model:value="formState.user" placeholder="Username"> <template #prefix ><UserOutlined style="color: rgba(0, 0, 0, 0.25)" /></template> </a-input> </a-form-item> <a-form-item> <a-input v-model:value="formState.password" type="password" placeholder="Password" > <template #prefix ><LockOutlined style="color: rgba(0, 0, 0, 0.25)" /></template> </a-input> </a-form-item> <a-form-item> <a-button class="m0" type="primary" html-type="submit" :disabled="formState.user === '' || formState.password === ''" @click="onSubmit" > Login </a-button> </a-form-item> </a-form> </div> <div v-else class="project-app-wrapper"> <div class="left"> <Sidebar /> <div class="main-content uranus-scrollbar dark"> <router-view /> </div> </div> <div class="right"> <div class="map-wrapper"> <GMap /> </div> <div class="media-wrapper" v-if="getMediaRoute()"> <MediaPanel /> </div> <div class="wayline-wrapper" v-if="getWaylineRoute()"> <WaylinePanel /> </div> </div> </div> </template> <script lang="ts" setup> import { LockOutlined, UserOutlined } from '@ant-design/icons-vue' import { message } from 'ant-design-vue' import { reactive, ref, UnwrapRef } from 'vue' import Sidebar from './sidebar.vue' import { login } from '/@/api/manage' import websocket from '/@/api/websocket' import GMap from '/@/components/GMap.vue' import MediaPanel from '/@/components/MediaPanel.vue' import WaylinePanel from '/@/components/wayline-panel.vue' import { useGMapCover } from '/@/hooks/use-g-map-cover' import { getRoot } from '/@/root' import { useMyStore } from '/@/store' interface FormState { user: string password: string } const root = getRoot() const showLogin = ref(true) const store = useMyStore() const formState: UnwrapRef<FormState> = reactive({ user: 'adminPC', password: 'adminPC' }) let socket = {} as any const gMapCoverHook = useGMapCover() const onSubmit = async (e: any) => { const result = await login({ username: formState.user, password: formState.password }) if (result.code === 0) { console.log(result) localStorage.setItem('x-auth-token', result.data.access_token) localStorage.setItem('workspace-id', result.data.workspace_id) localStorage.setItem('username', result.data.username) showLogin.value = false message.info('login success') socket = websocket.init(wsGetMsg) } } // function wsInfo (data) { // store.commit('SET_DEVICE_INFO', data) // } // function getDeviceInfo () { // const info = store.state.DeviceInfo // console.log(info) const wsGetMsg = async (res: any) => { const payload = JSON.parse(res.data) // console.log(payload) switch (payload.biz_code) { case 'gateway_osd': { store.commit('SET_GATEWAY_INFO', payload.data) break } case 'device_osd': { store.commit('SET_DEVICE_INFO', payload.data) break } case 'map_element_create': { store.commit('SET_MAP_ELEMENT_CREATE', payload.data) break } case 'map_element_update': { store.commit('SET_MAP_ELEMENT_UPDATE', payload.data) break } case 'map_element_delete': { store.commit('SET_MAP_ELEMENT_DELETE', payload.data) break } default: break } } function getMediaRoute () { return root.$route.name === 'media' } function getWaylineRoute () { return root.$route.name === 'wayline' } </script> <style lang="scss" scoped> @import '/@/styles/index.scss'; .login { background-color: $dark-highlight; height: 100vh; } .logo { color: $primary; } .project-app-wrapper { display: flex; position: absolute; transition: width 0.2s ease; height: 100%; width: 100%; .left { width: 450px; display: flex; background-color: #232323; float: left; } .right { width: 100%; height: 100%; .map-wrapper { width: 100%; height: 100%; } } .main-content { flex: 1; color: $text-white-basic; } .media-wrapper { position: absolute; top: 0; bottom: 0; z-index: 100; background: #f6f8fa; padding: 16px; } .wayline-wrapper { position: absolute; top: 0; bottom: 0; z-index: 100; background: #f6f8fa; padding: 16px; } } </style> src/pages/project-app/projects/layer.vue
New file @@ -0,0 +1,438 @@ <template> <div class="project-layer-wrapper"> <LayersTree :layer-data="mapLayers" class="project-layer-content" @check="checkLayer" @select="selectLayer" v-model:selectedKeys="selectedKeys" v-model:checkedKeys="checkedKeys" /> <a-drawer title="Map Element" placement="right" :closable="true" v-model:visible="visible" :mask="false" wrapClassName="drawer-element-wrapper" @close="closeDrawer" width="300" > <div class="drawer-element-content"> <div class="name element-item"> <span class="title">Name:</span> <a-input v-model:value="layerState.layerName" style="width:120px" placeholder="element name" @change="changeLayer" /> </div> <div class="longitude element-item" v-if="layerState.currentType === geoType.Point" > <span class="title">Longitude:</span> <a-input v-model:value="layerState.longitude" style="width:120px" placeholder="longitude" @change="changeLayer" /> </div> <div class="latitude element-item" v-if="layerState.currentType === geoType.Point" > <span class="title">Latitude:</span> <a-input v-model:value="layerState.latitude" style="width:120px" placeholder="latitude" @change="changeLayer" /> </div> <div class="color-content"> <span class="mr30">Color: </span> <div v-for="item in colors" :key="item.id" class="color-item" :style="'background:' + item.color" @click="changeColor(item)" > <svg-icon v-if="item.color === layerState.color" :size="18" name="check" ></svg-icon> </div> </div> </div> <div class="flex-row flex-justify-around flex-align-center mt20"> <a-button type="primary" @click="deleteElement">Delete</a-button> </div> </a-drawer> </div> </template> <script lang="ts" setup> import { onMounted, reactive, ref, watch } from 'vue' import { deleteElementReq, getElementGroupsReq, updateElementsReq } from '/@/api/layer' import LayersTree from '/@/components/LayersTree.vue' import { MapDoodleColor, MapElementEnum } from '/@/constants/map' import { useGMapCover } from '/@/hooks/use-g-map-cover' import { getRoot } from '/@/root' import { useMyStore } from '/@/store' import { GeojsonCoordinate, LayerResource } from '/@/types/map' import { Color, GeoType } from '/@/types/mapLayer' import { generatePoint } from '/@/utils/genjson' import { gcj02towgs84, wgs84togcj02 } from '/@/vendors/coordtransform' const root = getRoot() const store = useMyStore() let useGMapCoverHook = useGMapCover(store) console.log('store', store) const mapLayers = ref(store.state.Layers) const checkedKeys = ref<string[]>([]) const selectedKeys = ref<string[]>([]) const selectedKey = ref<string>('') const selectedLayer = ref<any>(null) const visible = ref<boolean>(false) store.commit('SET_DRAW_VISIBLE_INFO', visible.value) const geoType = GeoType const layerState = reactive({ layerName: '', layerId: '', longitude: 0, latitude: 0, currentType: '', // “LineString”,"Polygon","Point" color: '#212121' }) const colors = ref<Color[]>([ { id: 1, name: 'BLUE', color: '#2D8CF0', selected: true }, { id: 2, name: 'GREEN', color: '#19BE6B', selected: false }, { id: 3, name: 'YELLOW', color: '#FFBB00', selected: false }, { id: 4, name: 'ORANGE', color: '#B620E0', selected: false }, { id: 5, name: 'RED', color: '#E23C39', selected: false }, { id: 6, name: 'NAME_DEFAULT', color: '#212121', selected: false } ]) async function getAllElement () { getElementGroups('init') setTimeout(() => { useGMapCoverHook = useGMapCover() initMapCover() }, 1000) } function initMapCover () { mapLayers.value.forEach(item => { if (item.elements) { setMapCoverByElement(item.elements) } }) } watch( () => store.state.Layers, newData => { mapLayers.value = newData }, { deep: true } ) function setMapCoverByElement (elements: LayerResource[]) { elements.forEach(element => { const name = element.name const color = element.resource?.content.properties.color const type = element.resource?.type as number updateMapElement(element, name, color) }) } function updateMapElement ( element: LayerResource, name: string, color: string | undefined ) { const geoType = element.resource?.content.geometry.type const id = element.id const type = element.resource?.type as number if (MapElementEnum.PIN === type) { const coordinates = element.resource?.content.geometry .coordinates as GeojsonCoordinate useGMapCoverHook.updatePinElement(id, name, coordinates, color) } else if (MapElementEnum.LINE === type && geoType === 'LineString') { const coordinates = element.resource?.content.geometry .coordinates as GeojsonCoordinate[] useGMapCoverHook.initPolyline(name, coordinates, color, { id: id, name: name }) } else if (MapElementEnum.LINE === type && geoType === 'Polygon') { const coordinates = element.resource?.content.geometry .coordinates[0] as GeojsonCoordinate[] useGMapCoverHook.initPolygon(name, coordinates, color, { id: id, name: name }) } } function checkLayer (keys: string[]) { console.log('checkLayer', keys, selectedKeys.value, checkedKeys.value) } function selectLayer (keys: string[], e) { // console.log('selectLayer', e.node.eventKey, e.selected) if (e.selected) { selectedKey.value = e.node.eventKey selectedLayer.value = getCurrentLayer(selectedKey.value) setBaseInfo() } visible.value = e.selected store.commit('SET_DRAW_VISIBLE_INFO', visible.value) // store.dispatch('updateElement', { type: 'is_select', id: e.node.eventKey, bool: e.selected }) } function getCurrentLayer (id: string) { const Layers = store.state.Layers const key = id.replaceAll('resource__', '') // console.log('selectedKey.value', selectedKey.value) let layer = null const findCan = function (V) { V.forEach(item => { if (item.id === key) { layer = item } if (item.elements) { findCan(item.elements) } }) } findCan(Layers) // const layer = Layers.find(item => item.elements.find(el => el.id === key)) console.log('layer', layer) return layer } function setBaseInfo () { const layer = selectedLayer.value if (layer) { const geoType = layer.resource?.content.geometry.type // “LineString”,"Polygon","Point" layerState.currentType = geoType layerState.layerName = layer.name layerState.layerId = layer.id layerState.color = layer.resource?.content.properties.color switch (geoType) { case GeoType.Point: layerState.longitude = layer.resource?.content.geometry.coordinates[0] layerState.latitude = layer.resource?.content.geometry.coordinates[1] break case GeoType.LineString: break case GeoType.Polygon: break } } } onMounted(() => { getAllElement() }) function closeDrawer () { store.commit('SET_DRAW_VISIBLE_INFO', false) selectedKeys.value = [] } function changeColor (color: Color) { layerState.color = color.color updateElements() } function changeLayer (val: string) { updateElements() } async function deleteElement () { const elementid = selectedLayer.value.id await deleteElementReq(elementid, {}).then(async (res: any) => { // console.log('delete element res:', res) if (res.code !== 0) { console.warn(res) return } visible.value = false store.commit('SET_DRAW_VISIBLE_INFO', visible.value) useGMapCoverHook.removeCoverFromMap(elementid) getElementGroups() }) } async function getElementGroups (type?: string) { const result = await getElementGroupsReq({ groupId: '', isDistributed: true }) mapLayers.value = result.data mapLayers.value = updateWgs84togcj02() if (type && type === 'init') { store.dispatch('setLayerInfo', mapLayers.value) } store.commit('SET_LAYER_INFO', mapLayers.value) } async function updateElements () { let content = null if (layerState.currentType === GeoType.Point) { const position = { height: 0, latitude: Number(layerState.latitude || 0), longitude: Number(layerState.longitude || 0) } const cxt = generatePoint(position, { color: layerState.color || MapDoodleColor.PinColor, clampToGround: true }) content = { type: MapElementEnum.PIN, geometry: cxt.geometry, properties: cxt.properties } const currentLayer = selectedLayer.value currentLayer.resource.content = content selectedLayer.value = currentLayer } else { const currentLayer = selectedLayer.value content = currentLayer.resource.content content.properties.color = layerState.color } updateMapElement(selectedLayer.value, layerState.layerName, layerState.color) const result = await updateElementsReq(layerState.layerId, { name: layerState.layerName, content: content }) getElementGroups() } function updateWgs84togcj02 () { const layers = mapLayers.value layers.forEach(item => { if (item.elements) { item.elements.forEach(ele => { updateCoordinates('wgs84-gcj02', ele) }) } }) return layers } function updateCoordinates (transformType: string, element: LayerResource) { const geoType = element.resource?.content.geometry.type const type = element.resource?.type as number if (element.resource) { if (MapElementEnum.PIN === type) { const coordinates = element.resource?.content.geometry .coordinates as GeojsonCoordinate if (transformType === 'wgs84-gcj02') { const transResult = wgs84togcj02( coordinates[0], coordinates[1] ) as GeojsonCoordinate element.resource.content.geometry.coordinates = transResult } else if (transformType === 'gcj02-wgs84') { const transResult = gcj02towgs84( coordinates[0], coordinates[1] ) as GeojsonCoordinate element.resource.content.geometry.coordinates = transResult } } else if (MapElementEnum.LINE === type && geoType === 'LineString') { const coordinates = element.resource?.content.geometry .coordinates as GeojsonCoordinate[] if (transformType === 'wgs84-gcj02') { coordinates.forEach(coordinate => { coordinate = wgs84togcj02( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } else if (transformType === 'gcj02-wgs84') { coordinates.forEach(coordinate => { coordinate = gcj02towgs84( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } element.resource.content.geometry.coordinates = coordinates } else if (MapElementEnum.LINE === type && geoType === 'Polygon') { const coordinates = element.resource?.content.geometry .coordinates[0] as GeojsonCoordinate[] if (transformType === 'wgs84-gcj02') { coordinates.forEach(coordinate => { coordinate = wgs84togcj02( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } else if (transformType === 'gcj02-wgs84') { coordinates.forEach(coordinate => { coordinate = gcj02towgs84( coordinate[0], coordinate[1] ) as GeojsonCoordinate }) } element.resource.content.geometry.coordinates = [coordinates] } } } </script> <style lang="scss" scoped> @import '/@/styles/index.scss'; .project-layer-wrapper { padding-top: 16px; } </style> <style lang="scss"> .drawer-element-wrapper { .ant-drawer-content { background-color: $dark-highlight; color: $text-white-basic; .ant-drawer-header { background-color: $dark-highlight; .ant-drawer-title { color: $text-white-basic; } .ant-drawer-close { color: $text-white-basic; } } .ant-input { background-color: #101010; border-color: $dark-border; color: $text-white-basic; } } .color-content { display: flex; align-items: center; margin-top: 8px; .color-item { cursor: pointer; width: 18px; height: 18px; line-height: 18px; display: flex; align-items: center; margin-left: 5px; } } .title { display: inline-flex; width: 80px; } .element-item { margin-bottom: 10px; } } </style> src/pages/project-app/projects/livestream-agora.vue
New file @@ -0,0 +1,327 @@ <template> <div class="flex-column flex-justify-start flex-align-center"> <p class="fz24">Live streaming source selection</p> <div class="flex-row flex-justify-center flex-align-center mt10"> <a-select style="width:150px" placeholder="Select Drone" @select="onDroneSelect" > <a-select-option v-for="item in dronePara.droneList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Camera" @select="onCameraSelect" > <a-select-option v-for="item in dronePara.cameraList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Lens" @select="onVideoSelect" > <a-select-option class="ml10" v-for="item in dronePara.videoList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Clarity" @select="onClaritySelect" > <a-select-option v-for="item in clarityList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> </div> <p class="fz24 mt10">Agora Parameter</p> <p class="fz16"> Note: Obtain The Following Parameters From https://console.agora.io </p> <div class="flex-row flex-justify-center flex-align-center"> <a-input v-model:value="agoraPara.appid" placeholder="APP ID"></a-input> <a-input class="ml10" v-model:value="agoraPara.token" placeholder="Token" ></a-input> <a-input class="ml10" v-model:value="agoraPara.channel" placeholder="Channel" ></a-input> </div> <div class="mt20"> <p class="fz20"> Livestate:{{ livePara.liveState == false ? 'Stop' : 'Playing' }} </p> </div> <div class="mt10 flex-row flex-justify-center flex-align-center"> <a-button type="primary" large @click="onStart">Play</a-button> <a-button class="ml20" type="primary" large @click="onStop" >Stop</a-button > <a-button class="ml20" type="primary" large @click="onRefresh" >Refresh Live Capacity</a-button > </div> <div id="player"></div> </div> </template> <script lang="ts" setup> import AgoraRTC from 'agora-rtc-sdk-ng' import { onMounted, reactive } from 'vue' import { CURRENT_CONFIG as config } from '/@/api/http/config' import { getLiveCapacity, startLivestream, stopLivestream } from '/@/api/manage' import { getRoot } from '/@/root' const root = getRoot() const clarityList = [ { value: 0, label: 'Adaptive' }, { value: 1, label: 'Smooth' }, { value: 2, label: 'Standard' }, { value: 3, label: 'HD' }, { value: 4, label: 'Super Clear' } ] let agoraClient = {} as any const agoraPara = reactive({ appid: config.agoraAPPID, token: config.agoraToken, channel: config.agoraChannel, uid: null, stream: {} }) const dronePara = reactive({ livestreamSource: [], droneList: [], cameraList: [], videoList: [], droneSelected: '', cameraSelected: '', videoSelected: '', claritySelected: '' }) const livePara = reactive({ url: '', webrtc: {} as any, videoId: '', liveState: false }) const onRefresh = async () => { await getLiveCapacity({}) .then(res => { console.log(res) if (res.code === 0) { if (res.data === null) { console.warn('warning: get live capacity is null!!!') return } dronePara.livestreamSource = res.data dronePara.droneList = [] console.log('live_capacity:', dronePara.livestreamSource) if (dronePara.livestreamSource) { dronePara.livestreamSource.forEach((ele: any) => { dronePara.droneList.push({ label: ele.sn, value: ele.sn }) }) console.log(dronePara.droneList) } } }) .catch(error => { console.error(error) }) } onMounted(() => { onRefresh() agoraClient = AgoraRTC.createClient({ mode: 'live', codec: 'h264' }) agoraClient.setClientRole('audience') // Subscribe when a remote user publishes a stream agoraClient.on('user-published', async (user: any, mediaType: string) => { await agoraClient.subscribe(user, mediaType) if (mediaType === 'video') { console.log('subscribe success') // Get `RemoteVideoTrack` in the `user` object. const remoteVideoTrack = user.videoTrack // Dynamically create a container in the form of a DIV element for playing the remote video track. const remotePlayerContainer: any = document.getElementById('player') // Specify the ID of the DIV container. You can use the `uid` of the remote user. remotePlayerContainer.id = agoraPara.uid remotePlayerContainer.textContent = 'uid: ' + agoraPara.uid remotePlayerContainer.style.width = '640px' remotePlayerContainer.style.height = '480px' remoteVideoTrack.play(remotePlayerContainer) } }) agoraClient.on('user-unpublished', async (user: any) => { console.log('unpublish live:', user) await agoraClient.leave() }) }) const handleError = (err: any) => { console.error(err) } const handleJoinChannel = (uid: any) => { agoraPara.uid = uid } const onStart = async () => { const that = this console.log( 'drone parameter:', dronePara.droneSelected, dronePara.cameraSelected, dronePara.videoSelected, dronePara.claritySelected ) const timestamp = new Date().getTime().toString() const liveTimestamp = timestamp if ( dronePara.droneSelected == null || dronePara.cameraSelected == null || dronePara.videoSelected == null || dronePara.claritySelected == null ) { console.warn('waring: not select live para!!!') } livePara.videoId = dronePara.droneSelected + '/' + dronePara.cameraSelected + '/' + dronePara.videoSelected console.log(agoraPara) await agoraClient .join(agoraPara.appid, agoraPara.channel, agoraPara.token, null) .then((res: any) => { console.log('agora uid:', res) agoraPara.uid = res }) console.log(agoraPara.token) agoraPara.token = encodeURIComponent(agoraPara.token) console.log('agoraToken:', agoraPara.token) livePara.url = 'channel=' + agoraPara.channel + '&sn=' + dronePara.droneSelected + '&token=' + agoraPara.token + '&uid=' + agoraPara.uid await startLivestream({ url: livePara.url, video_id: livePara.videoId, url_type: 0, video_quality: dronePara.claritySelected }) .then(res => { livePara.liveState = true }) .catch(err => { console.error(err) }) } const onStop = async () => { stopLivestream({ video_id: livePara.videoId }).then(res => { livePara.liveState = false console.log('stop play livestream') }) } const onDroneSelect = (val: any) => { dronePara.droneSelected = val if (dronePara.droneSelected) { const droneTemp = dronePara.livestreamSource droneTemp.forEach(ele => { const drone = ele if (drone.sn === dronePara.droneSelected) { const cameraListTemp = drone.cameras_list dronePara.cameraList = [] cameraListTemp.forEach((ele: any) => { dronePara.cameraList.push({ label: ele.name, value: ele.index }) }) } }) } } const onCameraSelect = (val: any) => { dronePara.cameraSelected = val if (dronePara.cameraSelected) { const droneTemp = dronePara.livestreamSource droneTemp.forEach(ele => { const drone = ele if (drone.sn === dronePara.droneSelected) { const cameraListTemp = drone.cameras_list cameraListTemp.forEach((ele: any) => { const camera = ele if (camera.index === dronePara.cameraSelected) { const videoListTemp = camera.videos_list dronePara.videoList = [] videoListTemp.forEach((ele: any) => { dronePara.videoList.push({ label: ele.type, value: ele.index }) }) } }) } }) } } const onVideoSelect = (val: any) => { dronePara.videoSelected = val } const onClaritySelect = (val: any) => { dronePara.claritySelected = val } </script> <style lang="scss" scoped> @import '/@/styles/index.scss'; </style> src/pages/project-app/projects/livestream-others.vue
New file @@ -0,0 +1,351 @@ <template> <div class="flex-column flex-justify-start flex-align-center"> <video :style="{ width: '720px', height: '480px' }" id="video-webrtc" ref="videowebrtc" controls class="mt20" ></video> <p class="fz24">Live streaming source selection</p> <div class="flex-row flex-justify-center flex-align-center mt10"> <a-select style="width: 150px" placeholder="Select Live Type" @select="onLiveTypeSelect" > <a-select-option v-for="item in liveTypeList" :key="item.label" :value="item.value" > {{ item.label }} </a-select-option> </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Drone" @select="onDroneSelect" > <a-select-option v-for="item in droneList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Camera" @select="onCameraSelect" > <a-select-option v-for="item in cameraList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Lens" @select="onVideoSelect" > <a-select-option class="ml10" v-for="item in videoList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> <a-select class="ml10" style="width:150px" placeholder="Select Clarity" @select="onClaritySelect" > <a-select-option v-for="item in clarityList" :key="item.value" :value="item.value" >{{ item.label }}</a-select-option > </a-select> </div> <div class="mt20"> <p class="fz20">Livestate:{{ liveState == 0 ? 'Stop' : 'Playing' }}</p> <p class="fz10" v-if="livetypeSelected == 2"> Please use VLC media player to play the RTSP livestream !!! </p> <p class="fz10" v-if="livetypeSelected == 2"> RTSP Parameter:{{ rtspData }} </p> </div> <div class="mt10 flex-row flex-justify-center flex-align-center"> <a-button type="primary" large @click="onStart">Play</a-button> <a-button class="ml20" type="primary" large @click="onStop" >Stop</a-button > <a-button class="ml20" type="primary" large @click="onRefresh" >Refresh Live Capacity</a-button > </div> </div> </template> <script lang="ts" setup> import { message } from 'ant-design-vue' import { onMounted, ref } from 'vue' import { CURRENT_CONFIG as config } from '/@/api/http/config' import { getLiveCapacity, startLivestream, stopLivestream } from '/@/api/manage' import { getRoot } from '/@/root' import jswebrtc from '/@/vendors/jswebrtc.min.js' const root = getRoot() const liveTypeList = [ { value: 1, label: 'RTMP' }, { value: 2, label: 'RTSP' }, { value: 3, label: 'GB28181' } ] const clarityList = [ { value: 0, label: 'Adaptive' }, { value: 1, label: 'Smooth' }, { value: 2, label: 'Standard' }, { value: 3, label: 'HD' }, { value: 4, label: 'Super Clear' } ] const videowebrtc = ref(null) const livestreamSource = ref() const droneList = ref() const cameraList = ref() const videoList = ref() const droneSelected = ref() const cameraSelected = ref() const videoSeleted = ref() const claritySeleted = ref() const videoId = ref() const liveState = ref(0) const livetypeSelected = ref() const rtspData = ref() const onRefresh = async () => { await getLiveCapacity({}) .then(res => { console.log(res) if (res.code === 0) { if (res.data === null) { console.warn('warning: get live capacity is null!!!') return } const resData: Array<[]> = res.data console.log('live_capacity:', resData) livestreamSource.value = resData console.log(livestreamSource) const temp: Array<{}> = [] if (livestreamSource.value) { livestreamSource.value.forEach(ele => { temp.push({ label: ele.sn, value: ele.sn }) }) console.log(temp) droneList.value = temp console.log(droneList.value) } } }) .catch(error => { console.error(error) }) } onMounted(() => { onRefresh() }) const onStart = async () => { const that = this console.log( '直播参数:', livetypeSelected.value, droneSelected.value, cameraSelected.value, videoSeleted.value, claritySeleted.value ) const timestamp = new Date().getTime().toString() const liveTimestamp = timestamp if ( livetypeSelected.value == null || droneSelected.value == null || cameraSelected.value == null || videoSeleted.value == null || claritySeleted.value == null ) { console.warn('waring: not select live para!!!') return } videoId.value = droneSelected.value + '/' + cameraSelected.value + '/' + videoSeleted.value let liveURL = '' switch (livetypeSelected.value) { case 1: { // RTMP liveURL = config.rtmpURL + timestamp break } case 2: { // RTSP liveURL = config.rtspPara break } case 3: { // GB28181 liveURL = config.gb28181Para break } default: console.warn('warning: live type is not correct!!!') break } await startLivestream({ url: liveURL, video_id: videoId.value, url_type: livetypeSelected.value, video_quality: claritySeleted.value }) .then(res => { if (livetypeSelected.value === 3) { const url = res.data.url const videoElement = videowebrtc.value // gb28181,it will fail if not wait. message.loading({ content: '直播等待中。。。', duration: 4, onClose () { const player = new jswebrtc.Player(url, { video: videoElement, autoplay: true, onPlay: obj => { console.log('start play livestream') } }) liveState.value = 1 } }) } else if (livetypeSelected.value === 2) { console.log(res) rtspData.value = 'url:' + res.data.url + '&username:' + res.data.username + '&password:' + res.data.password } else if (livetypeSelected.value === 1) { const url = res.data.url const videoElement = videowebrtc.value console.log('start live:', url) const player = new jswebrtc.Player(url, { video: videoElement, autoplay: true, onPlay: obj => { console.log('start play livestream') liveState.value = 1 } }) } }) .catch(err => { console.error(err) }) } const onStop = () => { stopLivestream({ video_id: videoId.value }).then(res => { liveState.value = 0 console.log('stop play livestream') }) } const onLiveTypeSelect = (val: any) => { livetypeSelected.value = val } const onDroneSelect = (val: any) => { droneSelected.value = val const temp: Array<{}> = [] if (droneSelected.value) { const droneTemp = livestreamSource.value droneTemp.forEach(ele => { const drone = ele if (drone.sn === droneSelected.value) { const cameraListTemp = drone.cameras_list cameraListTemp.forEach(ele => { temp.push({ label: ele.name, value: ele.index }) }) cameraList.value = temp } }) } } const onCameraSelect = (val: any) => { cameraSelected.value = val const result: Array<{}> = [] if (cameraSelected.value) { const droneTemp = livestreamSource.value droneTemp.forEach(ele => { const drone = ele if (drone.sn === droneSelected.value) { const cameraListTemp = drone.cameras_list cameraListTemp.forEach(ele => { const camera = ele if (camera.index === cameraSelected.value) { const videoListTemp = camera.videos_list videoListTemp.forEach(ele => { result.push({ label: ele.type, value: ele.index }) }) videoList.value = result } }) } }) } } const onVideoSelect = (val: any) => { videoSeleted.value = val } const onClaritySelect = (val: any) => { claritySeleted.value = val } </script> <style lang="scss" scoped> @import '/@/styles/index.scss'; </style> src/pages/project-app/projects/livestream.vue
New file @@ -0,0 +1,82 @@ <template> <div class="flex-column flex-justify-start flex-align-center"> <a-button class="mt10 " style="width:90%" type="primary" @click="onAgoraLiveStream" >Agora Live</a-button > <a-button class="mt10" style="width:90%" type="primary" @click="onOthersLive" >RTMP/GB28181 Live</a-button > </div> <div v-if="enableAgoraLive"> <a-modal style="top:0" v-model:visible="enableAgoraLive" title="Agora Live" width="100%" :maskClosable="false" wrapClassName="full-modal" :footer="null" > <LiveAgora /> </a-modal> </div> <div v-if="enableOthersLive"> <a-modal style="top:0" v-model:visible="enableOthersLive" title="RTMP/GB28181/RTSP Live" width="100%" :maskClosable="false" wrapClassName="full-modal" :footer="null" > <LiveOthers /> </a-modal> </div> </template> <script lang="ts" setup> import { ref } from 'vue' import LiveAgora from './livestream-agora.vue' import LiveOthers from './livestream-others.vue' import { getRoot } from '/@/root' const root = getRoot() const enableAgoraLive = ref(false) const enableOthersLive = ref(false) const onAgoraLiveStream = () => { console.log('agora') enableAgoraLive.value = true } const onOthersLive = () => { console.log('liveview') enableOthersLive.value = true } </script> <style lang="scss"> .full-modal { .ant-modal { max-width: 100%; top: 0; padding-bottom: 0; margin: 0; } .ant-modal-content { display: flex; flex-direction: column; height: calc(100vh); } .ant-modal-body { flex: 1; } } </style> src/pages/project-app/projects/media.vue
New file @@ -0,0 +1,11 @@ <template> <div class="project-media-wrapper"> Media </div> </template> <script lang="ts" setup> </script> <style lang="scss" scoped> </style> src/pages/project-app/projects/tsa.vue
New file @@ -0,0 +1,11 @@ <template> <div class="project-tsa-wrapper"> TSA </div> </template> <script lang="ts" setup> </script> <style lang="scss" scoped> </style> src/pages/project-app/projects/wayline.vue
New file @@ -0,0 +1,9 @@ <template> <div class="project-wayline-wrapper"> wayline </div> </template> <script lang="ts" setup></script> <style lang="scss" scoped></style> src/pages/project-app/sidebar.vue
New file @@ -0,0 +1,103 @@ <template> <div class="demo-project-sidebar-wrapper"> <router-link v-for="item in options" :key="item.key" :to="item.path" :class="{ 'menu-item': true, selected: selectedRoute(item), disabled: item.key > 6 }" > <a-tooltip :title="item.label" placement="right"> <span>{{ item.label }}</span> </a-tooltip> </router-link> </div> </template> <script lang="ts"> import { defineComponent } from 'vue' import { getRoot } from '/@/root' interface IOptions { key: number label: string path: | string | { path: string query?: any } icon: string } export default defineComponent({ name: 'Sidebar', setup () { const root = getRoot() const options = [ { key: 0, label: 'livestream', path: '/livestream', icon: 'livestream' }, { key: 1, label: 'tsa', path: '/tsa', icon: 'tsa' }, { key: 2, label: 'layer', path: '/layer', icon: 'layer' }, { key: 3, label: 'media', path: '/media', icon: 'media' }, { key: 4, label: 'wayline', path: '/wayline', icon: 'wayline' } ] function selectedRoute (item: IOptions) { const path = typeof item.path === 'string' ? item.path : item.path.path return root.$route.path?.indexOf(path) === 0 } return { options, selectedRoute } } }) </script> <style scoped lang="scss"> .demo-project-sidebar-wrapper { display: flex; flex-direction: column; align-items: center; width: 80px; border-right: 1px solid #4f4f4f; color: $text-white-basic; // flex: 1; overflow: hidden; .menu-item { width: 100%; padding: 16px 0px; display: flex; flex-direction: column; align-items: center; color: $text-white-basic; cursor: pointer; &.selected { background-color: $dark-highlight; color: $primary; } &.disabled { pointer-events: none; opacity: 0.45; } } .filling { flex: 1; } .setting-icon { font-size: 24px; margin-bottom: 24px; color: $text-white-basic; } } </style> <style> .ant-tooltip-open { border: 0; } </style> src/plugins/svgBuilder.ts
New file @@ -0,0 +1,50 @@ import { readFileSync, readdirSync } from 'fs' let idPerfix = '' const svgTitle = /<svg([^>+].*?)>/ const clearHeightWidth = /(width|height)="([^>+].*?)"/g const hasViewBox = /(viewBox="[^>+].*?")/g const clearReturn = /(\r)|(\n)/g // Find the svg file function svgFind(e) { const arr = [] const dirents = readdirSync(e, { withFileTypes: true }) for (const dirent of dirents) { if (dirent.isDirectory()) arr.push(...svgFind(e + dirent.name + '/')) else { const svg = readFileSync(e + dirent.name) .toString() .replace(clearReturn, '') .replace(svgTitle, ($1, $2) => { let width = 0 let height = 0 let content = $2.replace(clearHeightWidth, (s1, s2, s3) => { if (s2 === 'width') width = s3 else if (s2 === 'height') height = s3 return '' }) if (!hasViewBox.test($2)) content += `viewBox="0 0 ${width} ${height}"` return `<symbol id="${idPerfix}-${dirent.name.replace('.svg', '')}" ${content}>` }).replace('</svg>', '</symbol>') arr.push(svg) } } return arr } export const svgBuilder = (path: any, perfix = 'icon') => { if (path === '') return idPerfix = perfix const res = svgFind(path) console.log(res) return { name: 'svg-transform', transformIndexHtml (dom: String) { return dom.replace( '<body>', `<body><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0" version="1.1">${res.join('')}</svg>` ) } } } src/root.ts
New file @@ -0,0 +1,24 @@ import { createApp, ComponentCustomProperties, App as VueApp } from 'vue' declare module '@vue/runtime-core' { interface ComponentCustomProperties { $aMap: any $aMapObj: any $mouseTool: any } } let root: ComponentCustomProperties let app = null as any export function createInstance (App: any): VueApp { app = createApp(App) root = app.config.globalProperties as ComponentCustomProperties return app } export function getRoot (): ComponentCustomProperties { return root } export function getApp (): VueApp { return app } src/router/index.ts
New file @@ -0,0 +1,70 @@ import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' import { ERouterName } from '/@/types/index' const routes: Array<RouteRecordRaw> = [ { path: '/' + ERouterName.Project, name: ERouterName.Project, // redirect: { // name: ERouterName.Project // }, component: () => import('/@/pages/project-app/index.vue'), children: [ { path: '/' + ERouterName.Livestream, component: () => import('/@/pages/project-app/projects/livestream.vue') }, { path: '/' + ERouterName.Tsa, component: () => import('/@/pages/project-app/projects/tsa.vue') }, { path: '/' + ERouterName.Layer, name: ERouterName.Layer, component: () => import('/@/pages/project-app/projects/layer.vue') }, { path: '/' + ERouterName.Media, name: ERouterName.Media, component: () => import('/@/pages/project-app/projects/media.vue') }, { path: '/' + ERouterName.Wayline, name: ERouterName.Wayline, component: () => import('/@/pages/project-app/projects/wayline.vue') }, ] }, { path: '/' + ERouterName.Pilot, name: ERouterName.Pilot, component: () => import('/@/pages/page-pilot/pilot-index.vue'), children: [ ] }, { path: '/' + ERouterName.PilotHome, component: () => import('/@/pages/page-pilot/pilot-home.vue') }, { path: '/' + ERouterName.PilotMedia, component: () => import('/@/pages/page-pilot/pilot-media.vue') }, { path: '/' + ERouterName.PilotLiveshare, component: () => import('/@/pages/page-pilot/pilot-liveshare.vue') }, { path: '/' + ERouterName.Element, name: ERouterName.Element, component: () => import('/@/pages/elements/elements.vue') } ] const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes }) export default router src/shims-vue.d.ts
New file @@ -0,0 +1,5 @@ declare module '*.vue' { import { DefineComponent } from 'vue' const component: DefineComponent<{}, {}, any> export default component } src/store/index.ts
New file @@ -0,0 +1,135 @@ import { InjectionKey } from 'vue' import { ActionTree, createStore, GetterTree, MutationTree, Store, StoreOptions, useStore } from 'vuex' import { getLayers } from '/@/api/layer' import { LayerType } from '/@/types/mapLayer' const initStateFunc = () => ({ Layers: [ { name: 'default', id: '', is_distributed: true, elements: [], is_check: false, is_select: false, type: 1 }, { name: 'share', id: '', is_distributed: true, elements: [], is_check: false, is_select: false, type: 2 } ], GatewayInfo: { // remote controller, dock }, DeviceInfo: { // drone }, layerBaseInfo: {} as { [key:string]:string }, drawVisible: false, coverList: [ ] as any, wsEvent: { mapElementCreat: {}, mapElementUpdate: {}, mapElementDelete: {} } }) export type RootStateType = ReturnType<typeof initStateFunc> const getters: GetterTree<RootStateType, RootStateType> = { } const mutations: MutationTree<RootStateType> = { SET_LAYER_INFO (state, info) { state.Layers = info }, SET_DEVICE_INFO (state, info) { state.DeviceInfo = info // console.log(state.DeviceInfo) }, SET_GATEWAY_INFO (state, info) { state.GatewayInfo = info // console.log(state.GatewayInfo) }, SET_DRAW_VISIBLE_INFO (state, bool) { state.drawVisible = bool }, SET_MAP_ELEMENT_CREATE (state, info) { state.wsEvent.mapElementCreat = info }, SET_MAP_ELEMENT_UPDATE (state, info) { state.wsEvent.mapElementUpdate = info }, SET_MAP_ELEMENT_DELETE (state, info) { state.wsEvent.mapElementDelete = info }, } const actions: ActionTree<RootStateType, RootStateType> = { async getAllElement ({ commit }) { const result = await getLayers({ groupId: '', isDistributed: true }) commit('SET_LAYER_INFO', result.data?.list) console.log(result) }, updateElement ({ state }, content: {type: 'is_check' | 'is_select', id: string, bool:boolean}) { const key = content.id.replaceAll('resource__', '') const type = content.type const layers = state.Layers const layer = layers.find(item => item.id === key) if (layer) { layer[type] = content.bool } }, setLayerInfo ({ state }, layers) { // const layers = state.Layers const obj:{ [key:string]:string } = {} layers.forEach(layer => { if (layer.type === LayerType.Default) { obj.default = layer.id } else { if (layer.type === LayerType.Share) { obj.share = layer.id } } }) state.layerBaseInfo = obj console.log('state.layerBaseInfo', state.layerBaseInfo) }, getLayerInfo ({ state }, id:string) { return state.layerBaseInfo[id] } } const storeOptions: StoreOptions<RootStateType> = { state: initStateFunc, getters, mutations, actions } const rootStore = createStore(storeOptions) export default rootStore export const storeKey: InjectionKey<Store<RootStateType>> = Symbol('') type AllStateStoreTypes = RootStateType & { // moduleName: moduleType } export function useMyStore<T = AllStateStoreTypes> () { return useStore<T>(storeKey) } src/styles/common.scss
New file @@ -0,0 +1,19 @@ html, body, #app, #my-app { height: 100%; overflow: hidden; } body { background-color: #f7f9fa; -webkit-font-smoothing: antialiased; // Prevent font enlargement in horizontal screen text-size-adjust: 100%; font-family: Roboto, sans-serif-medium, Arial, sans-serif; color: $main-text-color; font-size: 14px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } src/styles/flex.style.scss
New file @@ -0,0 +1,318 @@ .flex-display { display: flex; } .flex-column { @extend .flex-display; flex-direction: column; } .flex-row { @extend .flex-display; flex-direction: row; } .flex-align-start { align-items: flex-start; } .flex-align-end { align-items: flex-end; } .flex-align-baseline { align-items: baseline; } .flex-align-stretch { align-items: stretch; } .flex-align-center { align-items: center; } .flex-justify-start { justify-content: flex-start; } .flex-justify-end { justify-content: flex-end; } .flex-justify-center { justify-content: center; } .flex-justify-between { justify-content: space-between; } .flex-justify-around { justify-content: space-around; } //width .width-100vw { width: 100vw; } .width-100 { width: 100%; } //height .height-100vh { height: 100vh; } .height-100 { height: 100%; } //margin m-5 { margin: -5px !important; } .mt-5 { margin-top: -5px !important; } .mt100 { margin-top: 100px !important; } .mt110 { margin-top: 110px !important; } .mb-5 { margin-bottom: -5px !important; } .ml-5 { margin-left: -5px !important; } .mr-5 { margin-right: -5px !important; } .m0 { margin: 0px !important; } .mt0 { margin-top: 0px !important; } .mb0 { margin-bottom: 0px !important; } .ml0 { margin-left: 0px !important; } .mr0 { margin-right: 0px !important; } .m5 { margin: 5px !important; } .mt5 { margin-top: 5px !important; } .mb5 { margin-bottom: 5px !important; } .ml5 { margin-left: 5px !important; } .mr5 { margin-right: 5px !important; } .m10 { margin: 10px !important; } .mt10 { margin-top: 10px !important; } .mb10 { margin-bottom: 10px !important; } .ml10 { margin-left: 10px !important; } .mr10 { margin-right: 10px !important; } .m15 { margin: 15px !important; } .mt15 { margin-top: 15px !important; } .mb15 { margin-bottom: 15px !important; } .ml15 { margin-left: 15px !important; } .mr15 { margin-right: 15px !important; } .m20 { margin: 20px !important; } .mt20 { margin-top: 20px !important; } .mb20 { margin-bottom: 20px !important; } .ml20 { margin-left: 20px !important; } .mr20 { margin-right: 20px !important; } .m25 { margin: 25px !important; } .mt25 { margin-top: 25px !important; } .mb25 { margin-bottom: 25px !important; } .ml25 { margin-left: 25px !important; } .mr25 { margin-right: 25px !important; } .m30 { margin: 30px !important; } .mt30 { margin-top: 30px !important; } .mb30 { margin-bottom: 30px !important; } .ml30 { margin-left: 30px !important; } .ml40 { margin-left: 40px !important; } .mr30 { margin-right: 30px !important; } .m50 { margin: 50px !important; } .mt50 { margin-top: 50px !important; } .mb50 { margin-bottom: 50px !important; } .ml50 { margin-left: 50px !important; } .mr50 { margin-right: 50px !important; } // padding值 .p0 { padding: 0 !important; } .pt0 { padding-top: 0 !important; } .pr0 { padding-right: 0 !important; } .pb0 { padding-bottom: 0 !important; } .pl0 { padding-left: 0 !important; } .p5 { padding: 5px; } .pt5 { padding-top: 5px; } .pr5 { padding-right: 5px; } .pb5 { padding-bottom: 5px; } .pl5 { padding-left: 5px; } .p10 { padding: 10px; } .pt10 { padding-top: 10px; } .pr10 { padding-right: 10px; } .pb10 { padding-bottom: 10px; } .pl10 { padding-left: 10px; } .p15 { padding: 15px; } .pt15 { padding-top: 15px; } .pr15 { padding-right: 15px; } .pb15 { padding-bottom: 15px; } .pl15 { padding-left: 15px; } .p20 { padding: 20px; box-sizing: border-box; } .pt20 { padding-top: 20px; } .pr20 { padding-right: 20px; } .pb20 { padding-bottom: 20px; } .pl20 { padding-left: 20px; } .p30 { padding: 30px; box-sizing: border-box; } .pt30 { padding-top: 30px; } .pr30 { padding-right: 30px; } .pb30 { padding-bottom: 30px; } .pl30 { padding-left: 30px; } .pb50 { padding-bottom: 50px; } .pl50 { padding-left: 50px; } .pl120 { padding-left: 120px; } .pl150 { padding-left: 150px; } .pt50 { padding-top: 50px; } src/styles/fonts.scss
New file @@ -0,0 +1,72 @@ $font-family-sans-serif: 'Open Sans', BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', SimSun, sans-serif; $line-heights: ( 12: 20px, 14: 22px, 16: 24px, 18: 26px ); // 用法: @include text(12) @mixin text($size) { font-size: #{$size}px; line-height: map-get($line-heights, $size); } // 常规体 @mixin text-regular { font-weight: 400; } // 中粗体 @mixin text-semibold { font-weight: 600; } @mixin ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .fz10 { font-size: 10; } .fz12 { font-size: 12px; } .fz14 { font-size: 14px; } .fz16 { font-size: 16px; } .fz18 { font-size: 18px; } .fz20 { font-size: 20px; } .fz22 { font-size: 22px; } .fz24 { font-size: 24px; } .fz26 { font-size: 26px; } .fz28 { font-size: 28px; } .fz30 { font-size: 30px; } .fz32 { font-size: 32px; } .fz35 { font-size: 35px; } src/styles/index.scss
New file @@ -0,0 +1,3 @@ @import './common.scss'; @import 'flex.style.scss'; @import 'fonts.scss'; src/styles/reset.scss
New file @@ -0,0 +1,164 @@ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin : 0; padding : 0; border : 0; font : inherit; font-size : 100%; vertical-align: baseline; } html { line-height : 1; // -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } ol, ul { list-style: none; } table { border-collapse: collapse; border-spacing : 0; } caption, th, td { font-weight : normal; vertical-align: middle; } q, blockquote { quotes: none; } q::before, q::after, blockquote::before, blockquote::after { content: ''; content: none; } a img { border: none; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary { display: block; } * { box-sizing: content-box; } a { background : transparent; text-decoration: none; } button, input[type='number'], input[type='text'], input[type='password'], input[type='email'], input[type='search'], select, textarea { font-family : inherit; margin : 0; -webkit-appearance: none; } src/styles/variables.scss
New file @@ -0,0 +1,72 @@ $main-text-color: #000; $header-height: 52px; // Auxiliary color $info: #1fa3f6; $success: #28d445; $danger: #e70102; $alarm: #ffcc00; $warning: #ffcc00; $error: #e70102; // 品牌色 $primary: #2d8cf0; $primary-click: #2b85e4; $primary-hover: #5cadff; $primary-hover-dropdown: rgba($primary-hover, 0.2); $primary-disabled: #274d75; // 辅助色拓展 $danger-hover: #ff4d4e; $danger-active: #d40001; $menu-primary: #464c5b; // tab菜单主题色 // 图标颜色 $ic-white-normal: #fff; $ic-black-normal: #4e4e4e; $ic-hover: #a7a7a7; $ic-disabled: #5f5f5f; $ic-selected: #1088f2; // 中性色-黑 $dark-bg-light: #868688; // 背景色浅色 $dark-btn-hover: #5d5f61; // 按钮 hover 色 $dark-border: #4f4f4f; // 边框色 $dark-btn-disabled: #3c3c3c; // 按钮主色禁用 $dark-border-secondary: #393939; // 第二边框色 $dark-basic-primary: #232323; // 第一基础底色 $dark-basic-secondary: #282828; // 第二基础底色 $dark-highlight: #232323; // 高亮色 $dark-disable: #444444; // 置灰底色 $dark-project-disabled: #292929; // 中性色-白 $light-bg-primary: #fff; // 1 背景 $light-bg-secondary: #f7f9fa; // 2 背景 $light-divider: #e8eaec; // 3 分割线 $light-border: #dcdee2; // 4 边框 $light-disabled: #c5c8ce; // 5 失效 $light-auxiliary: #808695; // 6 辅助图标 $light-main-text: #515a6e; // 7 正文 ?用处 $light-title: #17233d; // 8 标题 ?用处 $light-bg-menu: #3b3e40; // 9 菜单栏背景色 ?用处 $light-border-secondary: #e8e8e8; // 第二边框色 // 字体 // 白色 $text-white-basic: #fff; // 基础色 $text-white-main: rgba($text-white-basic, 1); // 正文 $text-white-secondary: rgba($text-white-basic, 0.45); // 次级 $text-white-disabled: rgba($text-white-basic, 0.25); // 置灰 // 黑色 $text-black-basic: #000000; // 基础色 $text-black-emphasize: rgba($text-black-basic, 0.85); // 强调 $text-black-main: rgba($text-black-basic, 0.65); // 正文 $text-black-secondary: rgba($text-black-basic, 0.45); // 次要 $text-black-disabled: rgba($text-black-basic, 0.25); // 置灰 $text-link: $primary; $text-danger: $danger; // 标签 $tag-green: #19be6b; // 滚动条等颜色 $scroll-bar: #c5c8ce; $scroll-bar-dark: #5f5f5f; // 选择框 $select-disabled: #d8d8d8; src/types/enums.ts
New file @@ -0,0 +1,19 @@ export enum ERouterName { Element = 'element', Project = 'project', Tsa = 'tsa', Layer = 'layer', Media = 'media', Wayline = 'wayline', Livestream = 'livestream', Pilot = 'pilot-login', PilotHome = 'pilot-home', PilotMedia = 'pilot-media', PilotLiveshare = 'pilot-liveshare' } export enum EStorageKey { LANG_CODE = 'DJI_CREATE_VITE_H5_APP:lang_code', TEST_TOOLS_POSITION_STORAGE_KEY = 'DJI_CREATE_VITE_H5_APP:test_tools_position', SESSION_ID = 'DJI_CREATE_VITE_H5_APP:sess' } src/types/index.ts
New file @@ -0,0 +1 @@ export * from './enums' src/types/map-enum.ts
New file @@ -0,0 +1,6 @@ export enum MapDoodleEnum { PIN = 'pin', POLYLINE = 'polyline', POLYGON = 'polygon', Close = 'off' } src/types/map.d.ts
New file @@ -0,0 +1,100 @@ export interface MapGeographicPosition { longitude: number; latitude: number; height?: number; } export enum LayerType { Normal, Default, Share } export interface pinAMapPosition { KL: number className: string kT: number lng: number lat: number } export enum ResourceStatus { NotShow, Show } export type GeojsonCoordinate = [number, number, number?] export interface GeojsonLine { type: 'Feature' properties: { color: string directConnected?: boolean } geometry: { type: 'LineString' coordinates: GeojsonCoordinate[] } } export interface GeojsonPolygon { type: 'Feature' properties: { color: string } geometry: { type: 'Polygon' coordinates: GeojsonCoordinate[][] } } export interface GeojsonPoint { type: 'Feature' properties: { color: string clampToGround?: boolean } geometry: { type: 'Point' coordinates: GeojsonCoordinate } } export type GeojsonFeature = GeojsonLine | GeojsonPolygon | GeojsonPoint interface ResourceObjectBasic { user_name: string user_id?: string type:0| 1 | 2 content: unknown } export interface PinResource extends ResourceObjectBasic { type: 0 content: GeojsonFeature } export type ResourceObject = PinResource export enum LayerElevationLoadStatus { Unload, Load } export interface LayerResource { id: string name: string order: number status: ResourceStatus resource: ResourceObject | null display: number create_time: number elevation_load_status?: LayerElevationLoadStatus // } export interface Layer { id: string name: string order: number create_time: number type: LayerType is_distributed: boolean is_lock: boolean elements: null | LayerResource[], is_check?: boolean is_select?: boolean } src/types/mapLayer.ts
New file @@ -0,0 +1,98 @@ import { MapElementEnum } from '/@/constants/map' export interface mapLayerStyle { background: string } export interface mapLayerChildren { key: string style: mapLayerStyle title: string obj: any } export interface mapLayerChildrenObj { className: string key: string name: string type: string } // 拖拽事件 export interface DropEvent { node: { eventKey: string pos: string $parent: any } dragNode: { eventKey: string } dropPosition: number dropToGap: boolean } export interface mapLayer { key?: string title: string id: string name: string style: mapLayerStyle elements: any } export interface elementGroupsReq{ groupId: string isDistributed: boolean } export interface PostElementsBody { id: string name: string resource: { type: MapElementEnum, user_name?: string, content: { type:string, properties:{ color:string, clampToGround:boolean }, geometry:{ type:string, coordinates:unknown } }, } } export interface Color { id: number color: string selected: boolean, name: string } export enum GeoType { LineString = 'LineString', Polygon = 'Polygon', Point = 'Point' } export enum ResourceStatus { NotShow, Show } export enum LayerElevationLoadStatus { Unload, Load } export interface PutElementsBody { name?: string status?: ResourceStatus content?: unknown display?: number elevation_load_status?: LayerElevationLoadStatus } export enum LayerType { Normal, Default, Share, Reconstruction } src/use-common-components.ts
New file @@ -0,0 +1,13 @@ import { App, DefineComponent } from 'vue' const components: Record<string, DefineComponent<{}, {}, any>> = { } export const CommonComponents = { install (app: App): void { Object.keys(components).forEach(name => { app.component(name, components[name]) }) } } src/utils/data-process.ts
New file @@ -0,0 +1,4 @@ export function formatPhoneNum (phoneNum: string | number) { const str = String(phoneNum) return str.substring(0, 3) + '****' + str.slice(-4) } src/utils/genjson.ts
New file @@ -0,0 +1,81 @@ import { MapGeographicPosition, } from '/@/types/map' export type GeojsonCoordinate = [number, number, number?] export interface GeojsonLine { type: 'Feature' properties: { color: string directConnected?: boolean } geometry: { type: 'LineString' coordinates: GeojsonCoordinate[] } } export interface GeojsonPolygon { type: 'Feature' properties: { color: string } geometry: { type: 'Polygon' coordinates: GeojsonCoordinate[][] } } export interface GeojsonPoint { type: 'Feature' properties: { color: string clampToGround?: boolean } geometry: { type: 'Point' coordinates: GeojsonCoordinate } } export type GeojsonFeature = GeojsonLine | GeojsonPolygon | GeojsonPoint export function geographic2Coordinate (position: MapGeographicPosition): GeojsonCoordinate { const coordinates: GeojsonCoordinate = [position.longitude, position.latitude] if (position.height !== undefined) coordinates.push(position.height) return coordinates } export function generateLine (coordinates: MapGeographicPosition[], properties: GeojsonLine['properties']): GeojsonFeature { return { type: 'Feature', properties, geometry: { type: 'LineString', coordinates: coordinates.map(geographic2Coordinate), }, } } export function generatePolygon (coordinates: MapGeographicPosition[], properties: GeojsonPolygon['properties']): GeojsonFeature { return { type: 'Feature', properties, geometry: { type: 'Polygon', coordinates: [coordinates.map(geographic2Coordinate)], }, } } export function generatePoint (position: MapGeographicPosition, properties: GeojsonPoint['properties']): GeojsonFeature { return { type: 'Feature', properties, geometry: { type: 'Point', coordinates: geographic2Coordinate(position), }, } } src/utils/layer-tree.ts
New file @@ -0,0 +1,19 @@ const layerTreeTypes = ['layer', 'resource'] as const type LayerTreeType = (typeof layerTreeTypes)[number] const Spliter = '__' export function getLayerTreeKey (type: LayerTreeType, id: number | string) { return `${type}${Spliter}${id}` } export function isLayerTreeKey (key: string, type?: LayerTreeType) { if (type) { return key.startsWith(`${type}${Spliter}`) } else { return layerTreeTypes.some(t => key.startsWith(`${t}${Spliter}`)) } } export function getIdFromLayerTreeKey (key: string) { return key.split(Spliter)[1] } src/utils/logger.ts
New file @@ -0,0 +1,28 @@ /** * Used for log printing in a non-production environment * @param args */ export function consoleLog (...args: Parameters<typeof console.log>) { if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') { window.console.log.apply(null, args) // eslint-disable-line no-console } } export function consoleWarn (...args: Parameters<typeof console.warn>) { if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') { console.warn.apply(null, args) // eslint-disable-line no-console } } export function consoleError (...args: Parameters<typeof console.error>) { if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') { console.error.apply(null, args) // eslint-disable-line no-console } } export function testEnvLog (...args: Parameters<typeof console.log>) { if (import.meta.env.VITE_APP_ENVIRONMENT !== 'PROD') { console.log.apply(null, args) // eslint-disable-line no-console } } src/utils/map-layer-utils.ts
New file @@ -0,0 +1,44 @@ import { pinAMapPosition, MapGeographicPosition, Layer, LayerType, LayerElevationLoadStatus } from '/@/types/map' import { generatePoint, generateLine, generatePolygon } from '/@/utils/genjson' import { MapDoodleColor, MapElementEnum } from '/@/constants/map' function getPinPosition (pinAMapPosition: pinAMapPosition):MapGeographicPosition { return { height: 0, latitude: pinAMapPosition.lat, longitude: pinAMapPosition.lng } } export function generatePointContent (pinAMapPosition: pinAMapPosition) { const position = getPinPosition(pinAMapPosition) return { type: MapElementEnum.PIN, content: generatePoint(position, { color: MapDoodleColor.PinColor, clampToGround: true, }) } } function getLieOrPolyPosition (mapPosition: pinAMapPosition[]):MapGeographicPosition[] { const position = [] as MapGeographicPosition[] mapPosition.forEach(item => { position.push({ height: 0, latitude: item.lat, longitude: item.lng }) }) return position } export function generateLineContent (mapPosition: pinAMapPosition[]) { const position = getLieOrPolyPosition(mapPosition) return { type: MapElementEnum.LINE, content: generateLine(position, { color: MapDoodleColor.PolylineColor, directConnected: false, }) } } export function generatePolyContent (mapPosition: pinAMapPosition[]) { const position = getLieOrPolyPosition(mapPosition) return { type: MapElementEnum.POLY, content: generatePolygon(position, { color: MapDoodleColor.PolygonColor, }) } } src/utils/storage.ts
New file @@ -0,0 +1,42 @@ import { EStorageKey } from '/@/types/enums' import { consoleWarn } from './logger' function getStorageData (key: EStorageKey, parse?: boolean): string | null function getStorageData<T> (key: EStorageKey, parse?: boolean): T | null function getStorageData (key: EStorageKey, parse?: boolean): any { const value = window.localStorage.getItem(key) if (parse && value) { try { const result = JSON.parse(value) return result } catch (e) { consoleWarn('appStorage.get failed, err:', e) return null } } else { return value } } function clearStorageData (key: EStorageKey | EStorageKey[]) { let keyList: EStorageKey[] = [] if (Array.isArray(key)) { keyList = key } else { keyList = [key] } keyList.forEach(item => { window.localStorage.removeItem(item) }) } const appStorage = { save (key: EStorageKey, value: string) { window.localStorage.setItem(key, value) }, get: getStorageData, clear: clearStorageData, } export default appStorage src/utils/uuid.ts
New file @@ -0,0 +1,6 @@ export function uuidv4 () { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8) return v.toString(16) }) } src/vendors/coordtransform.js
New file @@ -0,0 +1,85 @@ /** * Conversion between the coordinates of the National Bureau of Survey and Measurement (Mars coordinates, GCJ02) and the WGS84 coordinate system */ const x_PI = 3.14159265358979324 * 3000.0 / 180.0; const PI = 3.1415926535897932384626; const a = 6378245.0; const ee = 0.00669342162296594323; /** * WGS84 to Mars coordinate system GCj02 * @param lng * @param lat * @returns {*[]} */ export function wgs84togcj02(lng, lat) { if (out_of_china(lng, lat)) { return [lng, lat] } else { var dlat = transformlat(lng - 105.0, lat - 35.0); var dlng = transformlng(lng - 105.0, lat - 35.0); var radlat = lat / 180.0 * PI; var magic = Math.sin(radlat); magic = 1 - ee * magic * magic; var sqrtmagic = Math.sqrt(magic); dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); var mglat = lat + dlat; var mglng = lng + dlng; return [mglng, mglat] } } /** * GCJ02 transform WGS84 * @param lng * @param lat * @returns {*[]} */ export function gcj02towgs84(lng, lat) { var lat = +lat; var lng = +lng; if (out_of_china(lng, lat)) { return [lng, lat] } else { var dlat = transformlat(lng - 105.0, lat - 35.0); var dlng = transformlng(lng - 105.0, lat - 35.0); var radlat = lat / 180.0 * PI; var magic = Math.sin(radlat); magic = 1 - ee * magic * magic; var sqrtmagic = Math.sqrt(magic); dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); var mglat = lat + dlat; var mglng = lng + dlng; return [lng * 2 - mglng, lat * 2 - mglat] } } function transformlat(lng, lat) { var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; return ret } export function transformlng(lng, lat) { var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; return ret } /** * Judge whether you are in the country or not if you are not in the country * @param lng * @param lat * @returns {boolean} */ function out_of_china(lng, lat) { return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); } src/vendors/jswebrtc.min.js
New file @@ -0,0 +1,2 @@ var JSWebrtc = { Player: null, VideoElement: null, CreateVideoElements: function () { const elements = document.querySelectorAll('.jswebrtc'); for (let i = 0; i < elements.length; i++) { new JSWebrtc.VideoElement(elements[i]) } }, FillQuery: function (query_string, obj) { obj.user_query = {}; if (query_string.length == 0) return; if (query_string.indexOf('?') >= 0)query_string = query_string.split('?')[1]; const queries = query_string.split('&'); for (let i = 0; i < queries.length; i++) { const query = queries[i].split('='); obj[query[0]] = query[1]; obj.user_query[query[0]] = query[1] } if (obj.domain)obj.vhost = obj.domain }, ParseUrl: function (rtmp_url) { const a = document.createElement('a'); a.href = rtmp_url.replace('rtmp://', 'http://').replace('webrtc://', 'http://').replace('rtc://', 'http://'); let vhost = a.hostname; let app = a.pathname.substr(1, a.pathname.lastIndexOf('/') - 1); const stream = a.pathname.substr(a.pathname.lastIndexOf('/') + 1); app = app.replace('...vhost...', '?vhost='); if (app.indexOf('?') >= 0) { const params = app.substr(app.indexOf('?')); app = app.substr(0, app.indexOf('?')); if (params.indexOf('vhost=') > 0) { vhost = params.substr(params.indexOf('vhost=') + 'vhost='.length); if (vhost.indexOf('&') > 0) { vhost = vhost.substr(0, vhost.indexOf('&')) } } } if (a.hostname == vhost) { const re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; if (re.test(a.hostname))vhost = '__defaultVhost__' } let schema = 'rtmp'; if (rtmp_url.indexOf('://') > 0)schema = rtmp_url.substr(0, rtmp_url.indexOf('://')); let port = a.port; if (!port) { if (schema === 'http') { port = 80 } else if (schema === 'https') { port = 443 } else if (schema === 'rtmp') { port = 1935 } else if (schema === 'webrtc' || schema === 'rtc') { port = 1985 } } const ret = { url: rtmp_url, schema: schema, server: a.hostname, port: port, vhost: vhost, app: app, stream: stream }; JSWebrtc.FillQuery(a.search, ret); return ret }, HttpPost: function (url, data) { return new Promise(function (resolve, reject) { let xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) { const respone = JSON.parse(xhr.responseText); xhr.onreadystatechange = new Function(); xhr = null; resolve(respone) } }; xhr.open('POST', url, true); xhr.timeout = 5e3; xhr.responseType = 'text'; xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(data) }) } }; if (document.readyState === 'complete') { JSWebrtc.CreateVideoElements() } else { document.addEventListener('DOMContentLoaded', JSWebrtc.CreateVideoElements) }JSWebrtc.VideoElement = (function () { 'use strict'; var VideoElement = function (element) { const url = element.dataset.url; if (!url) { throw 'VideoElement has no `data-url` attribute' } const addStyles = function (element, styles) { for (const name in styles) { element.style[name] = styles[name] } }; this.container = element; addStyles(this.container, { display: 'inline-block', position: 'relative', minWidth: '80px', minHeight: '80px' }); this.video = document.createElement('video'); this.video.width = 960; this.video.height = 540; addStyles(this.video, { display: 'block', width: '100%' }); this.container.appendChild(this.video); this.playButton = document.createElement('div'); this.playButton.innerHTML = VideoElement.PLAY_BUTTON; addStyles(this.playButton, { zIndex: 2, position: 'absolute', top: '0', bottom: '0', left: '0', right: '0', maxWidth: '75px', maxHeight: '75px', margin: 'auto', opacity: '0.7', cursor: 'pointer' }); this.container.appendChild(this.playButton); const options = { video: this.video }; for (const option in element.dataset) { try { options[option] = JSON.parse(element.dataset[option]) } catch (err) { options[option] = element.dataset[option] } } this.player = new JSWebrtc.Player(url, options); element.playerInstance = this.player; if (options.poster && !options.autoplay) { options.decodeFirstFrame = false; this.poster = new Image(); this.poster.src = options.poster; this.poster.addEventListener('load', this.posterLoaded); addStyles(this.poster, { display: 'block', zIndex: 1, position: 'absolute', top: 0, left: 0, bottom: 0, right: 0 }); this.container.appendChild(this.poster) } if (!this.player.options.streaming) { this.container.addEventListener('click', this.onClick.bind(this)) } if (options.autoplay) { this.playButton.style.display = 'none' } if (this.player.audioOut && !this.player.audioOut.unlocked) { let unlockAudioElement = this.container; if (options.autoplay) { this.unmuteButton = document.createElement('div'); this.unmuteButton.innerHTML = VideoElement.UNMUTE_BUTTON; addStyles(this.unmuteButton, { zIndex: 2, position: 'absolute', bottom: '10px', right: '20px', width: '75px', height: '75px', margin: 'auto', opacity: '0.7', cursor: 'pointer' }); this.container.appendChild(this.unmuteButton); unlockAudioElement = this.unmuteButton } this.unlockAudioBound = this.onUnlockAudio.bind(this, unlockAudioElement); unlockAudioElement.addEventListener('touchstart', this.unlockAudioBound, false); unlockAudioElement.addEventListener('click', this.unlockAudioBound, true) } }; VideoElement.prototype.onUnlockAudio = function (element, ev) { if (this.unmuteButton) { ev.preventDefault(); ev.stopPropagation() } this.player.audioOut.unlock(function () { if (this.unmuteButton) { this.unmuteButton.style.display = 'none' }element.removeEventListener('touchstart', this.unlockAudioBound); element.removeEventListener('click', this.unlockAudioBound) }.bind(this)) }; VideoElement.prototype.onClick = function (ev) { if (this.player.isPlaying) { this.player.pause(); this.playButton.style.display = 'block' } else { this.player.play(); this.playButton.style.display = 'none'; if (this.poster) { this.poster.style.display = 'none' } } }; VideoElement.PLAY_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" ' + 'viewBox="0 0 200 200" alt="Play video">' + '<circle cx="100" cy="100" r="90" fill="none" ' + 'stroke-width="15" stroke="#fff"/>' + '<polygon points="70, 55 70, 145 145, 100" fill="#fff"/>' + '</svg>'; VideoElement.UNMUTE_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" viewBox="0 0 75 75">' + '<polygon class="audio-speaker" stroke="none" fill="#fff" ' + 'points="39,13 22,28 6,28 6,47 21,47 39,62 39,13"/>' + '<g stroke="#fff" stroke-width="5">' + '<path d="M 49,50 69,26"/>' + '<path d="M 69,50 49,26"/>' + '</g>' + '</svg>'; return VideoElement }()); JSWebrtc.Player = (function () { 'use strict'; const Player = function (url, options) { this.options = options || {}; if (!url.match(/^webrtc?:\/\//)) { throw 'JSWebrtc just work with webrtc' } if (!this.options.video) { throw 'VideoElement is null' } this.urlParams = JSWebrtc.ParseUrl(url); this.pc = null; this.autoplay = !!options.autoplay || false; this.paused = true; if (this.autoplay) this.options.video.muted = true; this.startLoading() }; Player.prototype.startLoading = function () { const _self = this; if (_self.pc) { _self.pc.close() }_self.pc = new RTCPeerConnection(null); _self.pc.ontrack = function (event) { _self.options.video.srcObject = event.streams[0] }; _self.pc.addTransceiver('audio', { direction: 'recvonly' }); _self.pc.addTransceiver('video', { direction: 'recvonly' }); _self.pc.createOffer().then(function (offer) { return _self.pc.setLocalDescription(offer).then(function () { return offer }) }).then(function (offer) { return new Promise(function (resolve, reject) { const port = _self.urlParams.port || 1985; let api = _self.urlParams.user_query.play || '/rtc/v1/play/'; if (api.lastIndexOf('/') != api.length - 1) { api += '/' } let url = 'http://' + _self.urlParams.server + ':' + port + api; for (const key in _self.urlParams.user_query) { if (key != 'api' && key != 'play') { url += '&' + key + '=' + _self.urlParams.user_query[key] } } const data = { api: url, streamurl: _self.urlParams.url, clientip: null, sdp: offer.sdp }; console.log('offer: ', data); JSWebrtc.HttpPost(url, JSON.stringify(data)).then(function (res) { console.log('answer: ', res); resolve(res.sdp) }, function (rej) { reject(rej) }) }) }).then(function (answer) { return _self.pc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: answer })) }).catch(function (reason) { throw reason }); if (this.autoplay) { this.play() } }; Player.prototype.play = function (ev) { if (this.animationId) { return } this.animationId = requestAnimationFrame(this.update.bind(this)); this.paused = false }; Player.prototype.pause = function (ev) { if (this.paused) { return }cancelAnimationFrame(this.animationId); this.animationId = null; this.isPlaying = false; this.paused = true; this.options.video.pause(); if (this.options.onPause) { this.options.onPause(this) } }; Player.prototype.stop = function (ev) { this.pause() }; Player.prototype.destroy = function () { this.pause(); this.pc && this.pc.close() && this.pc.destroy(); this.audioOut && this.audioOut.destroy() }; Player.prototype.update = function () { this.animationId = requestAnimationFrame(this.update.bind(this)); if (this.options.video.readyState < 4) { return } if (!this.isPlaying) { this.isPlaying = true; this.options.video.play(); if (this.options.onPlay) { this.options.onPlay(this) } } }; return Player }()) export default JSWebrtc src/vite-env.d.ts
New file @@ -0,0 +1 @@ /// <reference types="vite/client" /> tsconfig.json
New file @@ -0,0 +1,29 @@ { "compilerOptions": { "target": "esnext", "module": "esnext", "moduleResolution": "node", "strict": true, "jsx": "preserve", "sourceMap": true, "resolveJsonModule": true, "esModuleInterop": true, "baseUrl": ".", "types": ["vite/client"], "lib": [ "esnext", "dom" ], "paths": { "/@/*": [ "src/*" ], } }, "include": [ "src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue" , "src/vendors/coordtransform.js" ] } vite.config.ts
New file @@ -0,0 +1,70 @@ import vue from '@vitejs/plugin-vue' // config alias import path from 'path' import { ConfigEnv, defineConfig, UserConfigExport } from 'vite' import ViteComponents, { AntDesignVueResolver } from 'vite-plugin-components' // Introduce eslint plugin import eslintPlugin from 'vite-plugin-eslint' import OptimizationPersist from 'vite-plugin-optimize-persist' import PkgConfig from 'vite-plugin-package-config' import viteSvgIcons from 'vite-plugin-svg-icons' import { viteVConsole } from 'vite-plugin-vconsole' // https://vitejs.dev/config/ export default ({ command, mode }: ConfigEnv): UserConfigExport => defineConfig({ plugins: [ vue(), eslintPlugin({ fix: true }), ViteComponents({ customComponentResolvers: [AntDesignVueResolver()], }), viteSvgIcons({ // 指定需要缓存的图标文件夹 iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], // 指定symbolId格式 symbolId: 'icon-[dir]-[name]', }), viteVConsole({ entry: path.resolve(__dirname, './src/main.ts'), // 入口文件 // localEnabled: command === 'serve', // serve开发环境下 // enabled: command !== 'serve' || mode === 'test', // 打包环境下/发布测试包, config: { // vconsole 配置项 maxLogNumber: 1000, theme: 'light' } }), PkgConfig(), OptimizationPersist() // [svgBuilder('./src/assets/icons/')] // All svg under src/icons/svg/ have been imported here, no need to import separately ], server: { open: true, host: '0.0.0.0', port: 8080 }, envDir: './env', resolve: { alias: [{ // https://github.com/vitejs/vite/issues/279#issuecomment-635646269 find: '/@', replacement: path.resolve(__dirname, './src'), } ] }, css: { preprocessorOptions: { scss: { // example : additionalData: `@import "./src/design/styles/variables";` // dont need include file extend .scss additionalData: '@import "./src/styles/variables";' }, } }, base: '/', build: { target: ['es2015'], // 最低支持 es2015 sourcemap: true } }) yarn.lock
New file @@ -0,0 +1,3927 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@amap/amap-jsapi-loader@^1.0.1": "integrity" "sha1-nsS01dJGfqxFH2yFLjXbaen58MA=" "resolved" "https://registry.npmmirror.com/@amap/amap-jsapi-loader/download/@amap/amap-jsapi-loader-1.0.1.tgz" "version" "1.0.1" "@ant-design/colors@^5.0.0": "integrity" "sha1-gAshhrHifmZDLmfQPtlq8+IdiUA=" "resolved" "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-5.1.1.tgz" "version" "5.1.1" dependencies: "@ctrl/tinycolor" "^3.3.1" "@ant-design/icons-svg@^4.0.0": "integrity" "sha1-hjDajrRHGkqr2u19H/apfcss8Fo=" "resolved" "https://registry.npmmirror.com/@ant-design/icons-svg/download/@ant-design/icons-svg-4.2.1.tgz?cache=0&sync_timestamp=1632478211055&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40ant-design%2Ficons-svg%2Fdownload%2F%40ant-design%2Ficons-svg-4.2.1.tgz" "version" "4.2.1" "@ant-design/icons-vue@^6.0.0", "@ant-design/icons-vue@^6.0.1": "integrity" "sha1-nYBMPHTSz6+XyxjlgtO5QAk09f0=" "resolved" "https://registry.npmmirror.com/@ant-design/icons-vue/download/@ant-design/icons-vue-6.0.1.tgz" "version" "6.0.1" dependencies: "@ant-design/colors" "^5.0.0" "@ant-design/icons-svg" "^4.0.0" "@types/lodash" "^4.14.165" "lodash" "^4.17.15" "@babel/code-frame@^7.16.7": "integrity" "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==" "resolved" "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/highlight" "^7.16.7" "@babel/code-frame@7.12.11": "integrity" "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8=" "resolved" "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz" "version" "7.12.11" dependencies: "@babel/highlight" "^7.10.4" "@babel/compat-data@^7.16.4": "integrity" "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" "resolved" "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.8.tgz" "version" "7.16.8" "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.17": "integrity" "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==" "resolved" "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/code-frame" "^7.16.7" "@babel/generator" "^7.16.7" "@babel/helper-compilation-targets" "^7.16.7" "@babel/helper-module-transforms" "^7.16.7" "@babel/helpers" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "convert-source-map" "^1.7.0" "debug" "^4.1.0" "gensync" "^1.0.0-beta.2" "json5" "^2.1.2" "semver" "^6.3.0" "source-map" "^0.5.0" "@babel/generator@^7.16.7", "@babel/generator@^7.16.8": "integrity" "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==" "resolved" "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.8.tgz" "version" "7.16.8" dependencies: "@babel/types" "^7.16.8" "jsesc" "^2.5.1" "source-map" "^0.5.0" "@babel/helper-compilation-targets@^7.16.7": "integrity" "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==" "resolved" "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/compat-data" "^7.16.4" "@babel/helper-validator-option" "^7.16.7" "browserslist" "^4.17.5" "semver" "^6.3.0" "@babel/helper-environment-visitor@^7.16.7": "integrity" "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==" "resolved" "https://registry.npmmirror.com/@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/types" "^7.16.7" "@babel/helper-function-name@^7.16.7": "integrity" "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==" "resolved" "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/helper-get-function-arity" "^7.16.7" "@babel/template" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-get-function-arity@^7.16.7": "integrity" "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==" "resolved" "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/types" "^7.16.7" "@babel/helper-hoist-variables@^7.16.7": "integrity" "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==" "resolved" "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7": "integrity" "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==" "resolved" "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/types" "^7.16.7" "@babel/helper-module-transforms@^7.16.7": "integrity" "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==" "resolved" "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-module-imports" "^7.16.7" "@babel/helper-simple-access" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "@babel/helper-plugin-utils@^7.10.4": "integrity" "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" "resolved" "https://registry.npmmirror.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.7.tgz" "version" "7.16.7" "@babel/helper-simple-access@^7.16.7": "integrity" "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==" "resolved" "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/types" "^7.16.7" "@babel/helper-split-export-declaration@^7.16.7": "integrity" "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==" "resolved" "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/types" "^7.16.7" "@babel/helper-validator-identifier@^7.16.7": "integrity" "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" "resolved" "https://registry.npmmirror.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.16.7.tgz" "version" "7.16.7" "@babel/helper-validator-option@^7.16.7": "integrity" "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" "resolved" "https://registry.npmmirror.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.16.7.tgz" "version" "7.16.7" "@babel/helpers@^7.16.7": "integrity" "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==" "resolved" "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/template" "^7.16.7" "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": "integrity" "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==" "resolved" "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/helper-validator-identifier" "^7.16.7" "chalk" "^2.0.0" "js-tokens" "^4.0.0" "@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8": "integrity" "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==" "resolved" "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.8.tgz" "version" "7.16.8" "@babel/plugin-syntax-import-meta@^7.10.4": "integrity" "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE=" "resolved" "https://registry.npm.taobao.org/@babel/plugin-syntax-import-meta/download/@babel/plugin-syntax-import-meta-7.10.4.tgz" "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.5": "integrity" "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==" "resolved" "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.7.tgz" "version" "7.16.7" dependencies: "regenerator-runtime" "^0.13.4" "@babel/standalone@^7.16.4": "integrity" "sha512-2xC+uqniw1MNMTxzkfRUD8y0koEav+cGyWNCTVFAMC58Mb6HYfxqzQt+YtdMpSEcNqrDjvatthhyU0v18PNrnA==" "resolved" "https://registry.npmmirror.com/@babel/standalone/download/@babel/standalone-7.16.9.tgz" "version" "7.16.9" "@babel/template@^7.16.7": "integrity" "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==" "resolved" "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.7.tgz" "version" "7.16.7" dependencies: "@babel/code-frame" "^7.16.7" "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" "@babel/traverse@^7.16.7": "integrity" "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==" "resolved" "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.8.tgz" "version" "7.16.8" dependencies: "@babel/code-frame" "^7.16.7" "@babel/generator" "^7.16.8" "@babel/helper-environment-visitor" "^7.16.7" "@babel/helper-function-name" "^7.16.7" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" "@babel/parser" "^7.16.8" "@babel/types" "^7.16.8" "debug" "^4.1.0" "globals" "^11.1.0" "@babel/types@^7.16.7", "@babel/types@^7.16.8": "integrity" "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==" "resolved" "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.8.tgz" "version" "7.16.8" dependencies: "@babel/helper-validator-identifier" "^7.16.7" "to-fast-properties" "^2.0.0" "@ctrl/tinycolor@^3.3.1": "integrity" "sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8=" "resolved" "https://registry.npmmirror.com/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz" "version" "3.4.0" "@eslint/eslintrc@^0.4.3": "integrity" "sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw=" "resolved" "https://registry.npmmirror.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.3.tgz" "version" "0.4.3" dependencies: "ajv" "^6.12.4" "debug" "^4.1.1" "espree" "^7.3.0" "globals" "^13.9.0" "ignore" "^4.0.6" "import-fresh" "^3.2.1" "js-yaml" "^3.13.1" "minimatch" "^3.0.4" "strip-json-comments" "^3.1.1" "@humanwhocodes/config-array@^0.5.0": "integrity" "sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk=" "resolved" "https://registry.npmmirror.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.5.0.tgz?cache=0&sync_timestamp=1635880739605&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40humanwhocodes%2Fconfig-array%2Fdownload%2F%40humanwhocodes%2Fconfig-array-0.5.0.tgz" "version" "0.5.0" dependencies: "@humanwhocodes/object-schema" "^1.2.0" "debug" "^4.1.1" "minimatch" "^3.0.4" "@humanwhocodes/object-schema@^1.2.0": "integrity" "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=" "resolved" "https://registry.npmmirror.com/@humanwhocodes/object-schema/download/@humanwhocodes/object-schema-1.2.1.tgz" "version" "1.2.1" "@intlify/core-base@9.1.9": "integrity" "sha1-5OjJUQEHKOSvOg0T10zz+eet1/Y=" "resolved" "https://registry.npmmirror.com/@intlify/core-base/download/@intlify/core-base-9.1.9.tgz" "version" "9.1.9" dependencies: "@intlify/devtools-if" "9.1.9" "@intlify/message-compiler" "9.1.9" "@intlify/message-resolver" "9.1.9" "@intlify/runtime" "9.1.9" "@intlify/shared" "9.1.9" "@intlify/vue-devtools" "9.1.9" "@intlify/devtools-if@9.1.9": "integrity" "sha1-ow4d0SVv8sXJjY110HU4T7qJjl0=" "resolved" "https://registry.npmmirror.com/@intlify/devtools-if/download/@intlify/devtools-if-9.1.9.tgz" "version" "9.1.9" dependencies: "@intlify/shared" "9.1.9" "@intlify/message-compiler@9.1.9": "integrity" "sha1-EZPL0iSnHC+5gUVbhTSjx2bSlI0=" "resolved" "https://registry.npmmirror.com/@intlify/message-compiler/download/@intlify/message-compiler-9.1.9.tgz" "version" "9.1.9" dependencies: "@intlify/message-resolver" "9.1.9" "@intlify/shared" "9.1.9" "source-map" "0.6.1" "@intlify/message-resolver@9.1.9": "integrity" "sha1-MVXM0vXm0NwWyti38djpf82gW/w=" "resolved" "https://registry.npmmirror.com/@intlify/message-resolver/download/@intlify/message-resolver-9.1.9.tgz?cache=0&sync_timestamp=1633533008021&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40intlify%2Fmessage-resolver%2Fdownload%2F%40intlify%2Fmessage-resolver-9.1.9.tgz" "version" "9.1.9" "@intlify/runtime@9.1.9": "integrity" "sha1-LBLOKVGKB1Yp7+0KjtKT7nQMsoU=" "resolved" "https://registry.npmmirror.com/@intlify/runtime/download/@intlify/runtime-9.1.9.tgz?cache=0&sync_timestamp=1633534552005&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40intlify%2Fruntime%2Fdownload%2F%40intlify%2Fruntime-9.1.9.tgz" "version" "9.1.9" dependencies: "@intlify/message-compiler" "9.1.9" "@intlify/message-resolver" "9.1.9" "@intlify/shared" "9.1.9" "@intlify/shared@9.1.9": "integrity" "sha1-C6r5YSi4VWBma+x4T/sB9mI8wXo=" "resolved" "https://registry.npmmirror.com/@intlify/shared/download/@intlify/shared-9.1.9.tgz" "version" "9.1.9" "@intlify/vue-devtools@9.1.9": "integrity" "sha1-K+j02+f37UEVZ26zI0gUHUEeQms=" "resolved" "https://registry.npmmirror.com/@intlify/vue-devtools/download/@intlify/vue-devtools-9.1.9.tgz" "version" "9.1.9" dependencies: "@intlify/message-resolver" "9.1.9" "@intlify/runtime" "9.1.9" "@intlify/shared" "9.1.9" "@nodelib/fs.scandir@2.1.5": "integrity" "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=" "resolved" "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz" "version" "2.1.5" dependencies: "@nodelib/fs.stat" "2.0.5" "run-parallel" "^1.1.9" "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": "integrity" "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=" "resolved" "https://registry.npmmirror.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz" "version" "2.0.5" "@nodelib/fs.walk@^1.2.3": "integrity" "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=" "resolved" "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1625769815389&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz" "version" "1.2.8" dependencies: "@nodelib/fs.scandir" "2.1.5" "fastq" "^1.6.0" "@rollup/pluginutils@^4.0.0", "@rollup/pluginutils@^4.1.0", "@rollup/pluginutils@^4.1.2": "integrity" "sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==" "resolved" "https://registry.npmmirror.com/@rollup/pluginutils/download/@rollup/pluginutils-4.1.2.tgz" "version" "4.1.2" dependencies: "estree-walker" "^2.0.1" "picomatch" "^2.2.2" "@simonwep/pickr@~1.8.0": "integrity" "sha1-ltyGZ1lA18rWPWnCIIPdHLuXl8s=" "resolved" "https://registry.nlark.com/@simonwep/pickr/download/@simonwep/pickr-1.8.2.tgz" "version" "1.8.2" dependencies: "core-js" "^3.15.1" "nanopop" "^2.1.0" "@trysound/sax@0.2.0": "integrity" "sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=" "resolved" "https://registry.nlark.com/@trysound/sax/download/@trysound/sax-0.2.0.tgz" "version" "0.2.0" "@types/estree@*": "integrity" "sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM=" "resolved" "https://registry.npmmirror.com/@types/estree/download/@types/estree-0.0.50.tgz?cache=0&sync_timestamp=1637266061438&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Festree%2Fdownload%2F%40types%2Festree-0.0.50.tgz" "version" "0.0.50" "@types/json-schema@^7.0.9": "integrity" "sha1-l+3JA36gw4WFMgsolk3eOznkZg0=" "resolved" "https://registry.npmmirror.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1637265456183&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz" "version" "7.0.9" "@types/json5@^0.0.29": "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" "resolved" "https://registry.npm.taobao.org/@types/json5/download/@types/json5-0.0.29.tgz" "version" "0.0.29" "@types/lodash@^4.14.165": "integrity" "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" "resolved" "https://registry.npmmirror.com/@types/lodash/download/@types/lodash-4.14.178.tgz" "version" "4.14.178" "@types/node@*", "@types/node@^16.3.2": "integrity" "sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng==" "resolved" "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.19.tgz" "version" "16.11.19" "@types/svgo@^2.6.0": "integrity" "sha512-4BfUnd19L25BD2iRyZTNuG4pfL9HBs+rvF7zp5maKhbX42uOpc5prGdBXXmCdHlVZfTWq8pNP/vxQt9v8ACxqQ==" "resolved" "https://registry.npmmirror.com/@types/svgo/download/@types/svgo-2.6.1.tgz" "version" "2.6.1" dependencies: "@types/node" "*" "@types/urlencode@^1.1.2": "integrity" "sha1-YMiiBmZ+TJaom0rkfowKna35A0s=" "resolved" "https://registry.npmmirror.com/@types/urlencode/download/@types/urlencode-1.1.2.tgz" "version" "1.1.2" "@typescript-eslint/eslint-plugin@^5.8.1": "integrity" "sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-5.9.1.tgz" "version" "5.9.1" dependencies: "@typescript-eslint/experimental-utils" "5.9.1" "@typescript-eslint/scope-manager" "5.9.1" "@typescript-eslint/type-utils" "5.9.1" "debug" "^4.3.2" "functional-red-black-tree" "^1.0.1" "ignore" "^5.1.8" "regexpp" "^3.2.0" "semver" "^7.3.5" "tsutils" "^3.21.0" "@typescript-eslint/experimental-utils@5.9.1": "integrity" "sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-5.9.1.tgz" "version" "5.9.1" dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.9.1" "@typescript-eslint/types" "5.9.1" "@typescript-eslint/typescript-estree" "5.9.1" "eslint-scope" "^5.1.1" "eslint-utils" "^3.0.0" "@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.8.1": "integrity" "sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/parser/download/@typescript-eslint/parser-5.9.1.tgz" "version" "5.9.1" dependencies: "@typescript-eslint/scope-manager" "5.9.1" "@typescript-eslint/types" "5.9.1" "@typescript-eslint/typescript-estree" "5.9.1" "debug" "^4.3.2" "@typescript-eslint/scope-manager@5.9.1": "integrity" "sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-5.9.1.tgz" "version" "5.9.1" dependencies: "@typescript-eslint/types" "5.9.1" "@typescript-eslint/visitor-keys" "5.9.1" "@typescript-eslint/type-utils@5.9.1": "integrity" "sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/type-utils/download/@typescript-eslint/type-utils-5.9.1.tgz" "version" "5.9.1" dependencies: "@typescript-eslint/experimental-utils" "5.9.1" "debug" "^4.3.2" "tsutils" "^3.21.0" "@typescript-eslint/types@5.9.1": "integrity" "sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/types/download/@typescript-eslint/types-5.9.1.tgz" "version" "5.9.1" "@typescript-eslint/typescript-estree@5.9.1": "integrity" "sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-5.9.1.tgz" "version" "5.9.1" dependencies: "@typescript-eslint/types" "5.9.1" "@typescript-eslint/visitor-keys" "5.9.1" "debug" "^4.3.2" "globby" "^11.0.4" "is-glob" "^4.0.3" "semver" "^7.3.5" "tsutils" "^3.21.0" "@typescript-eslint/visitor-keys@5.9.1": "integrity" "sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==" "resolved" "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-5.9.1.tgz" "version" "5.9.1" dependencies: "@typescript-eslint/types" "5.9.1" "eslint-visitor-keys" "^3.0.0" "@vitejs/plugin-legacy@^1.6.2": "integrity" "sha512-geH2F3hTRN++E4n9NZ0JFumxIWUKqW4FA9PAgM7Q6RvUOUUYW4tlURhEmCBYfZSN24H/yX3mEolX+wFVErsAYQ==" "resolved" "https://registry.npmmirror.com/@vitejs/plugin-legacy/download/@vitejs/plugin-legacy-1.6.4.tgz" "version" "1.6.4" dependencies: "@babel/standalone" "^7.16.4" "core-js" "^3.19.1" "magic-string" "^0.25.7" "regenerator-runtime" "^0.13.9" "systemjs" "^6.11.0" "@vitejs/plugin-vue@^1.2.4": "integrity" "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==" "resolved" "https://registry.npmmirror.com/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.10.2.tgz" "version" "1.10.2" "@vue/compiler-core@3.2.26": "integrity" "sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==" "resolved" "https://registry.npmmirror.com/@vue/compiler-core/download/@vue/compiler-core-3.2.26.tgz" "version" "3.2.26" dependencies: "@babel/parser" "^7.16.4" "@vue/shared" "3.2.26" "estree-walker" "^2.0.2" "source-map" "^0.6.1" "@vue/compiler-dom@3.2.26": "integrity" "sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg==" "resolved" "https://registry.npmmirror.com/@vue/compiler-dom/download/@vue/compiler-dom-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/compiler-core" "3.2.26" "@vue/shared" "3.2.26" "@vue/compiler-sfc@^3.0.5", "@vue/compiler-sfc@>=3.1.0", "@vue/compiler-sfc@3.2.26": "integrity" "sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==" "resolved" "https://registry.npmmirror.com/@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.26.tgz" "version" "3.2.26" dependencies: "@babel/parser" "^7.16.4" "@vue/compiler-core" "3.2.26" "@vue/compiler-dom" "3.2.26" "@vue/compiler-ssr" "3.2.26" "@vue/reactivity-transform" "3.2.26" "@vue/shared" "3.2.26" "estree-walker" "^2.0.2" "magic-string" "^0.25.7" "postcss" "^8.1.10" "source-map" "^0.6.1" "@vue/compiler-ssr@3.2.26": "integrity" "sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag==" "resolved" "https://registry.npmmirror.com/@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/compiler-dom" "3.2.26" "@vue/shared" "3.2.26" "@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.0.0-beta.18", "@vue/devtools-api@^6.0.0-beta.7": "integrity" "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw==" "resolved" "https://registry.npmmirror.com/@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.21.1.tgz" "version" "6.0.0-beta.21.1" "@vue/reactivity-transform@3.2.26": "integrity" "sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==" "resolved" "https://registry.npmmirror.com/@vue/reactivity-transform/download/@vue/reactivity-transform-3.2.26.tgz" "version" "3.2.26" dependencies: "@babel/parser" "^7.16.4" "@vue/compiler-core" "3.2.26" "@vue/shared" "3.2.26" "estree-walker" "^2.0.2" "magic-string" "^0.25.7" "@vue/reactivity@3.2.26": "integrity" "sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ==" "resolved" "https://registry.npmmirror.com/@vue/reactivity/download/@vue/reactivity-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/shared" "3.2.26" "@vue/runtime-core@3.2.26": "integrity" "sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ==" "resolved" "https://registry.npmmirror.com/@vue/runtime-core/download/@vue/runtime-core-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/reactivity" "3.2.26" "@vue/shared" "3.2.26" "@vue/runtime-dom@3.2.26": "integrity" "sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ==" "resolved" "https://registry.npmmirror.com/@vue/runtime-dom/download/@vue/runtime-dom-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/runtime-core" "3.2.26" "@vue/shared" "3.2.26" "csstype" "^2.6.8" "@vue/server-renderer@3.2.26": "integrity" "sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w==" "resolved" "https://registry.npmmirror.com/@vue/server-renderer/download/@vue/server-renderer-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/compiler-ssr" "3.2.26" "@vue/shared" "3.2.26" "@vue/shared@3.2.26": "integrity" "sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA==" "resolved" "https://registry.npmmirror.com/@vue/shared/download/@vue/shared-3.2.26.tgz" "version" "3.2.26" "acorn-jsx@^5.2.0", "acorn-jsx@^5.3.1": "integrity" "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=" "resolved" "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz" "version" "5.3.2" "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.1.1", "acorn@^7.4.0": "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" "resolved" "https://registry.npmmirror.com/acorn/download/acorn-7.4.1.tgz" "version" "7.4.1" "agora-rtc-sdk-ng@latest": "integrity" "sha512-Jogn3TQC7VdA7uZjGYmaAs0XzgYBgGs6nGA67/dQVjqC7kiwAfkQsAuvbevE/qxrVJmLfqtDTNxP40IFvnTlgQ==" "resolved" "https://registry.npmmirror.com/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.9.1.tgz" "version" "4.9.1" "ajv@^6.10.0", "ajv@^6.12.4": "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" "resolved" "https://registry.npmmirror.com/ajv/download/ajv-6.12.6.tgz" "version" "6.12.6" dependencies: "fast-deep-equal" "^3.1.1" "fast-json-stable-stringify" "^2.0.0" "json-schema-traverse" "^0.4.1" "uri-js" "^4.2.2" "ajv@^8.0.1": "integrity" "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==" "resolved" "https://registry.npmmirror.com/ajv/download/ajv-8.8.2.tgz" "version" "8.8.2" dependencies: "fast-deep-equal" "^3.1.1" "json-schema-traverse" "^1.0.0" "require-from-string" "^2.0.2" "uri-js" "^4.2.2" "ansi-colors@^4.1.1": "integrity" "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=" "resolved" "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz" "version" "4.1.1" "ansi-regex@^2.0.0": "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" "resolved" "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz" "version" "2.1.1" "ansi-regex@^5.0.1": "integrity" "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=" "resolved" "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz" "version" "5.0.1" "ansi-styles@^2.2.1": "integrity" "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" "resolved" "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-2.2.1.tgz" "version" "2.2.1" "ansi-styles@^3.2.1": "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" "resolved" "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-3.2.1.tgz" "version" "3.2.1" dependencies: "color-convert" "^1.9.0" "ansi-styles@^4.0.0", "ansi-styles@^4.1.0": "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" "resolved" "https://registry.npmmirror.com/ansi-styles/download/ansi-styles-4.3.0.tgz" "version" "4.3.0" dependencies: "color-convert" "^2.0.1" "ant-design-vue@^2.2.8": "integrity" "sha512-3graq9/gCfJQs6hznrHV6sa9oDmk/D1H3Oo0vLdVpPS/I61fZPk8NEyNKCHpNA6fT2cx6xx9U3QS63uuyikg/Q==" "resolved" "https://registry.npmmirror.com/ant-design-vue/download/ant-design-vue-2.2.8.tgz" "version" "2.2.8" dependencies: "@ant-design/icons-vue" "^6.0.0" "@babel/runtime" "^7.10.5" "@simonwep/pickr" "~1.8.0" "array-tree-filter" "^2.1.0" "async-validator" "^3.3.0" "dom-align" "^1.12.1" "dom-scroll-into-view" "^2.0.0" "lodash" "^4.17.21" "lodash-es" "^4.17.15" "moment" "^2.27.0" "omit.js" "^2.0.0" "resize-observer-polyfill" "^1.5.1" "scroll-into-view-if-needed" "^2.2.25" "shallow-equal" "^1.0.0" "vue-types" "^3.0.0" "warning" "^4.0.0" "anymatch@~3.1.2": "integrity" "sha1-wFV8CWrzLxBhmPT04qODU343hxY=" "resolved" "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz" "version" "3.1.2" dependencies: "normalize-path" "^3.0.0" "picomatch" "^2.0.4" "argparse@^1.0.7": "integrity" "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=" "resolved" "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz" "version" "1.0.10" dependencies: "sprintf-js" "~1.0.2" "arr-diff@^4.0.0": "integrity" "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" "resolved" "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz" "version" "4.0.0" "arr-flatten@^1.1.0": "integrity" "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" "resolved" "https://registry.nlark.com/arr-flatten/download/arr-flatten-1.1.0.tgz" "version" "1.1.0" "arr-union@^3.1.0": "integrity" "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" "resolved" "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz" "version" "3.1.0" "array-includes@^3.1.4": "integrity" "sha1-9bSTFix2DzU5Yx8AW6K7Rqy0W6k=" "resolved" "https://registry.npmmirror.com/array-includes/download/array-includes-3.1.4.tgz" "version" "3.1.4" dependencies: "call-bind" "^1.0.2" "define-properties" "^1.1.3" "es-abstract" "^1.19.1" "get-intrinsic" "^1.1.1" "is-string" "^1.0.7" "array-tree-filter@^2.1.0": "integrity" "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA=" "resolved" "https://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz" "version" "2.1.0" "array-union@^2.1.0": "integrity" "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=" "resolved" "https://registry.nlark.com/array-union/download/array-union-2.1.0.tgz" "version" "2.1.0" "array-unique@^0.3.2": "integrity" "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" "resolved" "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz" "version" "0.3.2" "array.prototype.flat@^1.2.5": "integrity" "sha1-B+CXXYS7x8SM0YedYJ5oJZjTPhM=" "resolved" "https://registry.npmmirror.com/array.prototype.flat/download/array.prototype.flat-1.2.5.tgz?cache=0&sync_timestamp=1633109609894&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Farray.prototype.flat%2Fdownload%2Farray.prototype.flat-1.2.5.tgz" "version" "1.2.5" dependencies: "call-bind" "^1.0.2" "define-properties" "^1.1.3" "es-abstract" "^1.19.0" "assign-symbols@^1.0.0": "integrity" "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" "resolved" "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz" "version" "1.0.0" "astral-regex@^2.0.0": "integrity" "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=" "resolved" "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz" "version" "2.0.0" "async-validator@^3.3.0": "integrity" "sha1-aOhmqWgk6LJpT/eoMcGiXETV5QA=" "resolved" "https://registry.npmmirror.com/async-validator/download/async-validator-3.5.2.tgz" "version" "3.5.2" "atob@^2.1.2": "integrity" "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=" "resolved" "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz" "version" "2.1.2" "axios@^0.21.1": "integrity" "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==" "resolved" "https://registry.npmmirror.com/axios/download/axios-0.21.4.tgz" "version" "0.21.4" dependencies: "follow-redirects" "^1.14.0" "babel-plugin-import@^1.13.3": "integrity" "sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc=" "resolved" "https://registry.npmmirror.com/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz" "version" "1.13.3" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/runtime" "^7.0.0" "balanced-match@^1.0.0": "integrity" "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=" "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" "version" "1.0.2" "base@^0.11.1": "integrity" "sha1-e95c7RRbbVUakNuH+DxVi060io8=" "resolved" "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz" "version" "0.11.2" dependencies: "cache-base" "^1.0.1" "class-utils" "^0.3.5" "component-emitter" "^1.2.1" "define-property" "^1.0.0" "isobject" "^3.0.1" "mixin-deep" "^1.2.0" "pascalcase" "^0.1.1" "big-integer@^1.6.17": "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" "resolved" "https://registry.npmmirror.com/big-integer/download/big-integer-1.6.51.tgz" "version" "1.6.51" "big.js@^5.2.2": "integrity" "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=" "resolved" "https://registry.npmmirror.com/big.js/download/big.js-5.2.2.tgz" "version" "5.2.2" "binary-extensions@^2.0.0": "integrity" "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=" "resolved" "https://registry.nlark.com/binary-extensions/download/binary-extensions-2.2.0.tgz" "version" "2.2.0" "binary@~0.3.0": "integrity" "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=" "resolved" "https://registry.npm.taobao.org/binary/download/binary-0.3.0.tgz" "version" "0.3.0" dependencies: "buffers" "~0.1.1" "chainsaw" "~0.1.0" "bluebird@^3.5.0": "integrity" "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=" "resolved" "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz" "version" "3.7.2" "bluebird@~3.4.1": "integrity" "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" "resolved" "https://registry.npm.taobao.org/bluebird/download/bluebird-3.4.7.tgz" "version" "3.4.7" "boolbase@^1.0.0": "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" "resolved" "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz" "version" "1.0.0" "brace-expansion@^1.1.7": "integrity" "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=" "resolved" "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010709807&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz" "version" "1.1.11" dependencies: "balanced-match" "^1.0.0" "concat-map" "0.0.1" "braces@^2.2.2": "integrity" "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=" "resolved" "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz" "version" "2.3.2" dependencies: "arr-flatten" "^1.1.0" "array-unique" "^0.3.2" "extend-shallow" "^2.0.1" "fill-range" "^4.0.0" "isobject" "^3.0.1" "repeat-element" "^1.1.2" "snapdragon" "^0.8.1" "snapdragon-node" "^2.0.1" "split-string" "^3.0.2" "to-regex" "^3.0.1" "braces@^3.0.1", "braces@~3.0.2": "integrity" "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=" "resolved" "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz" "version" "3.0.2" dependencies: "fill-range" "^7.0.1" "browserslist@^4.17.5": "integrity" "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==" "resolved" "https://registry.npmmirror.com/browserslist/download/browserslist-4.19.1.tgz" "version" "4.19.1" dependencies: "caniuse-lite" "^1.0.30001286" "electron-to-chromium" "^1.4.17" "escalade" "^3.1.1" "node-releases" "^2.0.1" "picocolors" "^1.0.0" "buffer-indexof-polyfill@~1.0.0": "integrity" "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=" "resolved" "https://registry.npm.taobao.org/buffer-indexof-polyfill/download/buffer-indexof-polyfill-1.0.2.tgz" "version" "1.0.2" "buffers@~0.1.1": "integrity" "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" "resolved" "https://registry.npm.taobao.org/buffers/download/buffers-0.1.1.tgz" "version" "0.1.1" "cache-base@^1.0.1": "integrity" "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=" "resolved" "https://registry.npmmirror.com/cache-base/download/cache-base-1.0.1.tgz?cache=0&sync_timestamp=1636237629294&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcache-base%2Fdownload%2Fcache-base-1.0.1.tgz" "version" "1.0.1" dependencies: "collection-visit" "^1.0.0" "component-emitter" "^1.2.1" "get-value" "^2.0.6" "has-value" "^1.0.0" "isobject" "^3.0.1" "set-value" "^2.0.0" "to-object-path" "^0.3.0" "union-value" "^1.0.0" "unset-value" "^1.0.0" "call-bind@^1.0.0", "call-bind@^1.0.2": "integrity" "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=" "resolved" "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz" "version" "1.0.2" dependencies: "function-bind" "^1.1.1" "get-intrinsic" "^1.0.2" "callsites@^3.0.0": "integrity" "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=" "resolved" "https://registry.nlark.com/callsites/download/callsites-3.1.0.tgz" "version" "3.1.0" "camel-case@^4.1.2": "integrity" "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=" "resolved" "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606867297052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz" "version" "4.1.2" dependencies: "pascal-case" "^3.1.2" "tslib" "^2.0.3" "caniuse-lite@^1.0.30001286": "integrity" "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==" "resolved" "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001299.tgz" "version" "1.0.30001299" "capital-case@^1.0.4": "integrity" "sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=" "resolved" "https://registry.nlark.com/capital-case/download/capital-case-1.0.4.tgz" "version" "1.0.4" dependencies: "no-case" "^3.0.4" "tslib" "^2.0.3" "upper-case-first" "^2.0.2" "chainsaw@~0.1.0": "integrity" "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=" "resolved" "https://registry.npm.taobao.org/chainsaw/download/chainsaw-0.1.0.tgz" "version" "0.1.0" dependencies: "traverse" ">=0.3.0 <0.4" "chalk@^1.1.3": "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" "resolved" "https://registry.npmmirror.com/chalk/download/chalk-1.1.3.tgz" "version" "1.1.3" dependencies: "ansi-styles" "^2.2.1" "escape-string-regexp" "^1.0.2" "has-ansi" "^2.0.0" "strip-ansi" "^3.0.0" "supports-color" "^2.0.0" "chalk@^2.0.0": "integrity" "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=" "resolved" "https://registry.npmmirror.com/chalk/download/chalk-2.4.2.tgz" "version" "2.4.2" dependencies: "ansi-styles" "^3.2.1" "escape-string-regexp" "^1.0.5" "supports-color" "^5.3.0" "chalk@^4.0.0": "integrity" "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=" "resolved" "https://registry.npmmirror.com/chalk/download/chalk-4.1.2.tgz" "version" "4.1.2" dependencies: "ansi-styles" "^4.1.0" "supports-color" "^7.1.0" "change-case@^4.1.2": "integrity" "sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=" "resolved" "https://registry.npm.taobao.org/change-case/download/change-case-4.1.2.tgz?cache=0&sync_timestamp=1606867326259&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchange-case%2Fdownload%2Fchange-case-4.1.2.tgz" "version" "4.1.2" dependencies: "camel-case" "^4.1.2" "capital-case" "^1.0.4" "constant-case" "^3.0.4" "dot-case" "^3.0.4" "header-case" "^2.0.4" "no-case" "^3.0.4" "param-case" "^3.0.4" "pascal-case" "^3.1.2" "path-case" "^3.0.4" "sentence-case" "^3.0.4" "snake-case" "^3.0.4" "tslib" "^2.0.3" "chokidar@>=3.0.0 <4.0.0": "integrity" "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==" "resolved" "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz" "version" "3.5.2" 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" "class-utils@^0.3.5": "integrity" "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=" "resolved" "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz" "version" "0.3.6" dependencies: "arr-union" "^3.1.0" "define-property" "^0.2.5" "isobject" "^3.0.0" "static-extend" "^0.1.1" "clone@^2.1.1": "integrity" "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" "resolved" "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz?cache=0&sync_timestamp=1589682821772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone%2Fdownload%2Fclone-2.1.2.tgz" "version" "2.1.2" "collection-visit@^1.0.0": "integrity" "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=" "resolved" "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz" "version" "1.0.0" dependencies: "map-visit" "^1.0.0" "object-visit" "^1.0.0" "color-convert@^1.9.0": "integrity" "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=" "resolved" "https://registry.npmmirror.com/color-convert/download/color-convert-1.9.3.tgz" "version" "1.9.3" dependencies: "color-name" "1.1.3" "color-convert@^2.0.1": "integrity" "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=" "resolved" "https://registry.npmmirror.com/color-convert/download/color-convert-2.0.1.tgz" "version" "2.0.1" dependencies: "color-name" "~1.1.4" "color-name@~1.1.4": "integrity" "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" "resolved" "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz" "version" "1.1.4" "color-name@1.1.3": "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" "resolved" "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz" "version" "1.1.3" "commander@^7.2.0": "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" "resolved" "https://registry.npmmirror.com/commander/download/commander-7.2.0.tgz" "version" "7.2.0" "component-emitter@^1.2.1": "integrity" "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=" "resolved" "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz" "version" "1.3.0" "compute-scroll-into-view@^1.0.17": "integrity" "sha1-aojxis2dQunPS6pr7H4FImB6t6s=" "resolved" "https://registry.npm.taobao.org/compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz?cache=0&sync_timestamp=1614043178722&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompute-scroll-into-view%2Fdownload%2Fcompute-scroll-into-view-1.0.17.tgz" "version" "1.0.17" "concat-map@0.0.1": "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" "resolved" "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz" "version" "0.0.1" "constant-case@^3.0.4": "integrity" "sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=" "resolved" "https://registry.npm.taobao.org/constant-case/download/constant-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconstant-case%2Fdownload%2Fconstant-case-3.0.4.tgz" "version" "3.0.4" dependencies: "no-case" "^3.0.4" "tslib" "^2.0.3" "upper-case" "^2.0.2" "convert-source-map@^1.7.0": "integrity" "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=" "resolved" "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz?cache=0&sync_timestamp=1624045304679&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.8.0.tgz" "version" "1.8.0" dependencies: "safe-buffer" "~5.1.1" "cookie-storage@^6.1.0": "integrity" "sha1-KRsvZi2WG+RPmZYmWTQhy/zyN5A=" "resolved" "https://registry.nlark.com/cookie-storage/download/cookie-storage-6.1.0.tgz" "version" "6.1.0" "copy-descriptor@^0.1.0": "integrity" "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" "resolved" "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz" "version" "0.1.1" "copy-text-to-clipboard@^3.0.1": "integrity" "sha1-jL+PkOCkfxLkokdDc2Jl0Ve85pw=" "resolved" "https://registry.npm.taobao.org/copy-text-to-clipboard/download/copy-text-to-clipboard-3.0.1.tgz" "version" "3.0.1" "core-js@^3.11.0", "core-js@^3.15.1", "core-js@^3.19.1": "integrity" "sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw==" "resolved" "https://registry.npmmirror.com/core-js/download/core-js-3.20.2.tgz" "version" "3.20.2" "core-util-is@~1.0.0": "integrity" "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=" "resolved" "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz" "version" "1.0.3" "cors@^2.8.5": "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==" "resolved" "https://registry.npmmirror.com/cors/download/cors-2.8.5.tgz" "version" "2.8.5" dependencies: "object-assign" "^4" "vary" "^1" "cross-spawn@^7.0.2": "integrity" "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=" "resolved" "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz" "version" "7.0.3" dependencies: "path-key" "^3.1.0" "shebang-command" "^2.0.0" "which" "^2.0.1" "css-select@^4.1.3": "integrity" "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==" "resolved" "https://registry.npmmirror.com/css-select/download/css-select-4.2.1.tgz" "version" "4.2.1" dependencies: "boolbase" "^1.0.0" "css-what" "^5.1.0" "domhandler" "^4.3.0" "domutils" "^2.8.0" "nth-check" "^2.0.1" "css-tree@^1.1.2", "css-tree@^1.1.3": "integrity" "sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=" "resolved" "https://registry.npmmirror.com/css-tree/download/css-tree-1.1.3.tgz" "version" "1.1.3" dependencies: "mdn-data" "2.0.14" "source-map" "^0.6.1" "css-what@^5.1.0": "integrity" "sha1-P3tweq32M7r2LCzrhXm1RbtA9/4=" "resolved" "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz" "version" "5.1.0" "csso@^4.2.0": "integrity" "sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=" "resolved" "https://registry.npmmirror.com/csso/download/csso-4.2.0.tgz" "version" "4.2.0" dependencies: "css-tree" "^1.1.2" "csstype@^2.6.8": "integrity" "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" "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" "version" "2.6.19" "debug@^2.2.0": "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" "resolved" "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz" "version" "2.6.9" dependencies: "ms" "2.0.0" "debug@^2.3.3": "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" "resolved" "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz" "version" "2.6.9" dependencies: "ms" "2.0.0" "debug@^2.6.9": "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" "resolved" "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz" "version" "2.6.9" dependencies: "ms" "2.0.0" "debug@^3.2.7": "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" "resolved" "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz" "version" "3.2.7" dependencies: "ms" "^2.1.1" "debug@^4.0.1", "debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.3": "integrity" "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==" "resolved" "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz" "version" "4.3.3" dependencies: "ms" "2.1.2" "decode-uri-component@^0.2.0": "integrity" "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" "resolved" "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz" "version" "0.2.0" "deep-is@^0.1.3": "integrity" "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=" "resolved" "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz" "version" "0.1.4" "define-properties@^1.1.3": "integrity" "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=" "resolved" "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz" "version" "1.1.3" dependencies: "object-keys" "^1.0.12" "define-property@^0.2.5": "integrity" "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=" "resolved" "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz" "version" "0.2.5" dependencies: "is-descriptor" "^0.1.0" "define-property@^1.0.0": "integrity" "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=" "resolved" "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz" "version" "1.0.0" dependencies: "is-descriptor" "^1.0.0" "define-property@^2.0.2": "integrity" "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=" "resolved" "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz" "version" "2.0.2" dependencies: "is-descriptor" "^1.0.2" "isobject" "^3.0.1" "dir-glob@^3.0.1": "integrity" "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=" "resolved" "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz" "version" "3.0.1" dependencies: "path-type" "^4.0.0" "doctrine@^2.1.0": "integrity" "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=" "resolved" "https://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz" "version" "2.1.0" dependencies: "esutils" "^2.0.2" "doctrine@^3.0.0": "integrity" "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=" "resolved" "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz" "version" "3.0.0" dependencies: "esutils" "^2.0.2" "dom-align@^1.12.1": "integrity" "sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs=" "resolved" "https://registry.nlark.com/dom-align/download/dom-align-1.12.2.tgz" "version" "1.12.2" "dom-scroll-into-view@^2.0.0": "integrity" "sha1-DezIUigB/Y0/HGujVadNOCxfmJs=" "resolved" "https://registry.npm.taobao.org/dom-scroll-into-view/download/dom-scroll-into-view-2.0.1.tgz" "version" "2.0.1" "dom-serializer@^1.0.1": "integrity" "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=" "resolved" "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz" "version" "1.3.2" dependencies: "domelementtype" "^2.0.1" "domhandler" "^4.2.0" "entities" "^2.0.0" "dom-serializer@0": "integrity" "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=" "resolved" "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256830355&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz" "version" "0.2.2" dependencies: "domelementtype" "^2.0.1" "entities" "^2.0.0" "domelementtype@^1.3.1", "domelementtype@1": "integrity" "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=" "resolved" "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1617298554829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz" "version" "1.3.1" "domelementtype@^2.0.1", "domelementtype@^2.2.0": "integrity" "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=" "resolved" "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298554829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz" "version" "2.2.0" "domhandler@^2.3.0": "integrity" "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=" "resolved" "https://registry.npmmirror.com/domhandler/download/domhandler-2.4.2.tgz" "version" "2.4.2" dependencies: "domelementtype" "1" "domhandler@^4.2.0", "domhandler@^4.3.0": "integrity" "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==" "resolved" "https://registry.npmmirror.com/domhandler/download/domhandler-4.3.0.tgz" "version" "4.3.0" dependencies: "domelementtype" "^2.2.0" "domutils@^1.5.1": "integrity" "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=" "resolved" "https://registry.npmmirror.com/domutils/download/domutils-1.7.0.tgz" "version" "1.7.0" dependencies: "dom-serializer" "0" "domelementtype" "1" "domutils@^2.8.0": "integrity" "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=" "resolved" "https://registry.npmmirror.com/domutils/download/domutils-2.8.0.tgz" "version" "2.8.0" dependencies: "dom-serializer" "^1.0.1" "domelementtype" "^2.2.0" "domhandler" "^4.2.0" "dot-case@^3.0.4": "integrity" "sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=" "resolved" "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz?cache=0&sync_timestamp=1606867327042&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-case%2Fdownload%2Fdot-case-3.0.4.tgz" "version" "3.0.4" dependencies: "no-case" "^3.0.4" "tslib" "^2.0.3" "duplexer2@~0.1.4": "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" "resolved" "https://registry.npm.taobao.org/duplexer2/download/duplexer2-0.1.4.tgz" "version" "0.1.4" dependencies: "readable-stream" "^2.0.2" "electron-to-chromium@^1.4.17": "integrity" "sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg==" "resolved" "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.43.tgz" "version" "1.4.43" "emoji-regex@^8.0.0": "integrity" "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=" "resolved" "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz" "version" "8.0.0" "emojis-list@^3.0.0": "integrity" "sha1-VXBmIEatKeLpFucariYKvf9Pang=" "resolved" "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz" "version" "3.0.0" "enquirer@^2.3.5": "integrity" "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=" "resolved" "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz" "version" "2.3.6" dependencies: "ansi-colors" "^4.1.1" "entities@^1.1.1": "integrity" "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" "resolved" "https://registry.nlark.com/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-1.1.2.tgz" "version" "1.1.2" "entities@^2.0.0": "integrity" "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=" "resolved" "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz" "version" "2.2.0" "es-abstract@^1.19.0", "es-abstract@^1.19.1": "integrity" "sha1-1IhXlodpFpWd547aoN9FZicRXsM=" "resolved" "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz?cache=0&sync_timestamp=1633234313248&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.19.1.tgz" "version" "1.19.1" dependencies: "call-bind" "^1.0.2" "es-to-primitive" "^1.2.1" "function-bind" "^1.1.1" "get-intrinsic" "^1.1.1" "get-symbol-description" "^1.0.0" "has" "^1.0.3" "has-symbols" "^1.0.2" "internal-slot" "^1.0.3" "is-callable" "^1.2.4" "is-negative-zero" "^2.0.1" "is-regex" "^1.1.4" "is-shared-array-buffer" "^1.0.1" "is-string" "^1.0.7" "is-weakref" "^1.0.1" "object-inspect" "^1.11.0" "object-keys" "^1.1.1" "object.assign" "^4.1.2" "string.prototype.trimend" "^1.0.4" "string.prototype.trimstart" "^1.0.4" "unbox-primitive" "^1.0.1" "es-module-lexer@^0.9.3": "integrity" "sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk=" "resolved" "https://registry.npmmirror.com/es-module-lexer/download/es-module-lexer-0.9.3.tgz?cache=0&sync_timestamp=1633645560577&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-module-lexer%2Fdownload%2Fes-module-lexer-0.9.3.tgz" "version" "0.9.3" "es-to-primitive@^1.2.1": "integrity" "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=" "resolved" "https://registry.nlark.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz" "version" "1.2.1" dependencies: "is-callable" "^1.1.4" "is-date-object" "^1.0.1" "is-symbol" "^1.0.2" "esbuild-darwin-64@0.13.15": "integrity" "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==" "resolved" "https://registry.npmmirror.com/esbuild-darwin-64/download/esbuild-darwin-64-0.13.15.tgz" "version" "0.13.15" "esbuild@^0.13.12": "integrity" "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==" "resolved" "https://registry.npmmirror.com/esbuild/download/esbuild-0.13.15.tgz" "version" "0.13.15" optionalDependencies: "esbuild-android-arm64" "0.13.15" "esbuild-darwin-64" "0.13.15" "esbuild-darwin-arm64" "0.13.15" "esbuild-freebsd-64" "0.13.15" "esbuild-freebsd-arm64" "0.13.15" "esbuild-linux-32" "0.13.15" "esbuild-linux-64" "0.13.15" "esbuild-linux-arm" "0.13.15" "esbuild-linux-arm64" "0.13.15" "esbuild-linux-mips64le" "0.13.15" "esbuild-linux-ppc64le" "0.13.15" "esbuild-netbsd-64" "0.13.15" "esbuild-openbsd-64" "0.13.15" "esbuild-sunos-64" "0.13.15" "esbuild-windows-32" "0.13.15" "esbuild-windows-64" "0.13.15" "esbuild-windows-arm64" "0.13.15" "escalade@^3.1.1": "integrity" "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=" "resolved" "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567224085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz" "version" "3.1.1" "escape-string-regexp@^1.0.2": "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz" "version" "1.0.5" "escape-string-regexp@^1.0.5": "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz" "version" "1.0.5" "escape-string-regexp@^4.0.0": "integrity" "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=" "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz" "version" "4.0.0" "escape-string-regexp@1.0.5": "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" "resolved" "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz" "version" "1.0.5" "eslint-config-standard@^16.0.3": "integrity" "sha1-bIdh5UTpbFMf+SZC7rh4QrhIhRY=" "resolved" "https://registry.npmmirror.com/eslint-config-standard/download/eslint-config-standard-16.0.3.tgz" "version" "16.0.3" "eslint-import-resolver-node@^0.3.6": "integrity" "sha1-QEi5WDldqJZoJSAB29nsprg7rL0=" "resolved" "https://registry.nlark.com/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.6.tgz?cache=0&sync_timestamp=1629046546232&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-import-resolver-node%2Fdownload%2Feslint-import-resolver-node-0.3.6.tgz" "version" "0.3.6" dependencies: "debug" "^3.2.7" "resolve" "^1.20.0" "eslint-module-utils@^2.7.2": "integrity" "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==" "resolved" "https://registry.npmmirror.com/eslint-module-utils/download/eslint-module-utils-2.7.2.tgz" "version" "2.7.2" dependencies: "debug" "^3.2.7" "find-up" "^2.1.0" "eslint-plugin-es@^3.0.0": "integrity" "sha1-dafN/czdwFiZNK7rOEF18iHFeJM=" "resolved" "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.1.tgz?cache=0&sync_timestamp=1605769798981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-es%2Fdownload%2Feslint-plugin-es-3.0.1.tgz" "version" "3.0.1" dependencies: "eslint-utils" "^2.0.0" "regexpp" "^3.0.0" "eslint-plugin-import@^2.22.1", "eslint-plugin-import@^2.23.4": "integrity" "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==" "resolved" "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.25.4.tgz" "version" "2.25.4" dependencies: "array-includes" "^3.1.4" "array.prototype.flat" "^1.2.5" "debug" "^2.6.9" "doctrine" "^2.1.0" "eslint-import-resolver-node" "^0.3.6" "eslint-module-utils" "^2.7.2" "has" "^1.0.3" "is-core-module" "^2.8.0" "is-glob" "^4.0.3" "minimatch" "^3.0.4" "object.values" "^1.1.5" "resolve" "^1.20.0" "tsconfig-paths" "^3.12.0" "eslint-plugin-node@^11.1.0": "integrity" "sha1-yVVEQW7kraJnQKMEdO78VALcZx0=" "resolved" "https://registry.npmmirror.com/eslint-plugin-node/download/eslint-plugin-node-11.1.0.tgz" "version" "11.1.0" dependencies: "eslint-plugin-es" "^3.0.0" "eslint-utils" "^2.0.0" "ignore" "^5.1.1" "minimatch" "^3.0.4" "resolve" "^1.10.1" "semver" "^6.1.0" "eslint-plugin-promise@^4.2.1 || ^5.0.0", "eslint-plugin-promise@^5.1.0": "integrity" "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==" "resolved" "https://registry.npmmirror.com/eslint-plugin-promise/download/eslint-plugin-promise-5.2.0.tgz" "version" "5.2.0" "eslint-plugin-vue@^7.13.0": "integrity" "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==" "resolved" "https://registry.npmmirror.com/eslint-plugin-vue/download/eslint-plugin-vue-7.20.0.tgz" "version" "7.20.0" dependencies: "eslint-utils" "^2.1.0" "natural-compare" "^1.4.0" "semver" "^6.3.0" "vue-eslint-parser" "^7.10.0" "eslint-scope@^5.1.1": "integrity" "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=" "resolved" "https://registry.npmmirror.com/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1637466913662&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz" "version" "5.1.1" dependencies: "esrecurse" "^4.3.0" "estraverse" "^4.1.1" "eslint-utils@^2.0.0": "integrity" "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=" "resolved" "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz" "version" "2.1.0" dependencies: "eslint-visitor-keys" "^1.1.0" "eslint-utils@^2.1.0": "integrity" "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=" "resolved" "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz" "version" "2.1.0" dependencies: "eslint-visitor-keys" "^1.1.0" "eslint-utils@^3.0.0": "integrity" "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=" "resolved" "https://registry.nlark.com/eslint-utils/download/eslint-utils-3.0.0.tgz" "version" "3.0.0" dependencies: "eslint-visitor-keys" "^2.0.0" "eslint-visitor-keys@^1.1.0": "integrity" "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=" "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz" "version" "1.3.0" "eslint-visitor-keys@^1.3.0": "integrity" "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=" "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz" "version" "1.3.0" "eslint-visitor-keys@^2.0.0": "integrity" "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=" "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-2.1.0.tgz" "version" "2.1.0" "eslint-visitor-keys@^3.0.0": "integrity" "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==" "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/download/eslint-visitor-keys-3.1.0.tgz?cache=0&sync_timestamp=1636378395014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-3.1.0.tgz" "version" "3.1.0" "eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", "eslint@^7.0.0", "eslint@^7.12.1", "eslint@^7.26.0", "eslint@^7.30.0", "eslint@>=4.19.1", "eslint@>=5", "eslint@>=5.0.0", "eslint@>=5.16.0": "integrity" "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==" "resolved" "https://registry.npmmirror.com/eslint/download/eslint-7.32.0.tgz" "version" "7.32.0" dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.3" "@humanwhocodes/config-array" "^0.5.0" "ajv" "^6.10.0" "chalk" "^4.0.0" "cross-spawn" "^7.0.2" "debug" "^4.0.1" "doctrine" "^3.0.0" "enquirer" "^2.3.5" "escape-string-regexp" "^4.0.0" "eslint-scope" "^5.1.1" "eslint-utils" "^2.1.0" "eslint-visitor-keys" "^2.0.0" "espree" "^7.3.1" "esquery" "^1.4.0" "esutils" "^2.0.2" "fast-deep-equal" "^3.1.3" "file-entry-cache" "^6.0.1" "functional-red-black-tree" "^1.0.1" "glob-parent" "^5.1.2" "globals" "^13.6.0" "ignore" "^4.0.6" "import-fresh" "^3.0.0" "imurmurhash" "^0.1.4" "is-glob" "^4.0.0" "js-yaml" "^3.13.1" "json-stable-stringify-without-jsonify" "^1.0.1" "levn" "^0.4.1" "lodash.merge" "^4.6.2" "minimatch" "^3.0.4" "natural-compare" "^1.4.0" "optionator" "^0.9.1" "progress" "^2.0.0" "regexpp" "^3.1.0" "semver" "^7.2.1" "strip-ansi" "^6.0.0" "strip-json-comments" "^3.1.0" "table" "^6.0.9" "text-table" "^0.2.0" "v8-compile-cache" "^2.0.3" "espree@^6.2.1": "integrity" "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o=" "resolved" "https://registry.npmmirror.com/espree/download/espree-6.2.1.tgz" "version" "6.2.1" dependencies: "acorn" "^7.1.1" "acorn-jsx" "^5.2.0" "eslint-visitor-keys" "^1.1.0" "espree@^7.3.0", "espree@^7.3.1": "integrity" "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y=" "resolved" "https://registry.npmmirror.com/espree/download/espree-7.3.1.tgz" "version" "7.3.1" dependencies: "acorn" "^7.4.0" "acorn-jsx" "^5.3.1" "eslint-visitor-keys" "^1.3.0" "esprima@^4.0.0": "integrity" "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" "resolved" "https://registry.nlark.com/esprima/download/esprima-4.0.1.tgz" "version" "4.0.1" "esquery@^1.4.0": "integrity" "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=" "resolved" "https://registry.npm.taobao.org/esquery/download/esquery-1.4.0.tgz" "version" "1.4.0" dependencies: "estraverse" "^5.1.0" "esrecurse@^4.3.0": "integrity" "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=" "resolved" "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz" "version" "4.3.0" dependencies: "estraverse" "^5.2.0" "estraverse@^4.1.1": "integrity" "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=" "resolved" "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz" "version" "4.3.0" "estraverse@^5.1.0": "integrity" "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=" "resolved" "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz" "version" "5.3.0" "estraverse@^5.2.0": "integrity" "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=" "resolved" "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz" "version" "5.3.0" "estree-walker@^2.0.1", "estree-walker@^2.0.2": "integrity" "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=" "resolved" "https://registry.npmmirror.com/estree-walker/download/estree-walker-2.0.2.tgz" "version" "2.0.2" "esutils@^2.0.2": "integrity" "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=" "resolved" "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz" "version" "2.0.3" "etag@^1.8.1": "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" "resolved" "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz" "version" "1.8.1" "expand-brackets@^2.1.4": "integrity" "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=" "resolved" "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz" "version" "2.1.4" dependencies: "debug" "^2.3.3" "define-property" "^0.2.5" "extend-shallow" "^2.0.1" "posix-character-classes" "^0.1.0" "regex-not" "^1.0.0" "snapdragon" "^0.8.1" "to-regex" "^3.0.1" "extend-shallow@^2.0.1": "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=" "resolved" "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz" "version" "2.0.1" dependencies: "is-extendable" "^0.1.0" "extend-shallow@^3.0.0": "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" "resolved" "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz" "version" "3.0.2" dependencies: "assign-symbols" "^1.0.0" "is-extendable" "^1.0.1" "extend-shallow@^3.0.2": "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=" "resolved" "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz" "version" "3.0.2" dependencies: "assign-symbols" "^1.0.0" "is-extendable" "^1.0.1" "extglob@^2.0.2": "integrity" "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=" "resolved" "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz" "version" "2.0.4" dependencies: "array-unique" "^0.3.2" "define-property" "^1.0.0" "expand-brackets" "^2.1.4" "extend-shallow" "^2.0.1" "fragment-cache" "^0.2.1" "regex-not" "^1.0.0" "snapdragon" "^0.8.1" "to-regex" "^3.0.1" "fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": "integrity" "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=" "resolved" "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz" "version" "3.1.3" "fast-glob@^3.2.7", "fast-glob@^3.2.9": "integrity" "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==" "resolved" "https://registry.npmmirror.com/fast-glob/download/fast-glob-3.2.10.tgz" "version" "3.2.10" 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" "fast-json-stable-stringify@^2.0.0": "integrity" "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=" "resolved" "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz" "version" "2.1.0" "fast-levenshtein@^2.0.6": "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" "resolved" "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz" "version" "2.0.6" "fastq@^1.6.0": "integrity" "sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw=" "resolved" "https://registry.nlark.com/fastq/download/fastq-1.13.0.tgz" "version" "1.13.0" dependencies: "reusify" "^1.0.4" "file-entry-cache@^6.0.1": "integrity" "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=" "resolved" "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz?cache=0&sync_timestamp=1613794357372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-6.0.1.tgz" "version" "6.0.1" dependencies: "flat-cache" "^3.0.4" "fill-range@^4.0.0": "integrity" "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=" "resolved" "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz" "version" "4.0.0" dependencies: "extend-shallow" "^2.0.1" "is-number" "^3.0.0" "repeat-string" "^1.6.1" "to-regex-range" "^2.1.0" "fill-range@^7.0.1": "integrity" "sha1-GRmmp8df44ssfHflGYU12prN2kA=" "resolved" "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz" "version" "7.0.1" dependencies: "to-regex-range" "^5.0.1" "filter-obj@^1.1.0": "integrity" "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" "resolved" "https://registry.nlark.com/filter-obj/download/filter-obj-1.1.0.tgz?cache=0&sync_timestamp=1630004006859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffilter-obj%2Fdownload%2Ffilter-obj-1.1.0.tgz" "version" "1.1.0" "find-up@^2.1.0": "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" "resolved" "https://registry.npmmirror.com/find-up/download/find-up-2.1.0.tgz" "version" "2.1.0" dependencies: "locate-path" "^2.0.0" "flat-cache@^3.0.4": "integrity" "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=" "resolved" "https://registry.nlark.com/flat-cache/download/flat-cache-3.0.4.tgz" "version" "3.0.4" dependencies: "flatted" "^3.1.0" "rimraf" "^3.0.2" "flatted@^3.1.0": "integrity" "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" "resolved" "https://registry.npmmirror.com/flatted/download/flatted-3.2.4.tgz?cache=0&sync_timestamp=1636473813364&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fflatted%2Fdownload%2Fflatted-3.2.4.tgz" "version" "3.2.4" "follow-redirects@^1.14.0": "integrity" "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" "resolved" "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.7.tgz" "version" "1.14.7" "for-in@^1.0.2": "integrity" "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" "resolved" "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz" "version" "1.0.2" "fragment-cache@^0.2.1": "integrity" "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=" "resolved" "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz" "version" "0.2.1" dependencies: "map-cache" "^0.2.2" "fs-extra@^10.0.0": "integrity" "sha1-n/YbZV3eU/s0qC34S7IUzoAuF8E=" "resolved" "https://registry.nlark.com/fs-extra/download/fs-extra-10.0.0.tgz?cache=0&sync_timestamp=1622604476909&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffs-extra%2Fdownload%2Ffs-extra-10.0.0.tgz" "version" "10.0.0" dependencies: "graceful-fs" "^4.2.0" "jsonfile" "^6.0.1" "universalify" "^2.0.0" "fs.realpath@^1.0.0": "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "resolved" "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz" "version" "1.0.0" "fsevents@~2.3.2": "integrity" "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=" "resolved" "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz" "version" "2.3.2" "fstream@^1.0.12": "integrity" "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=" "resolved" "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz" "version" "1.0.12" dependencies: "graceful-fs" "^4.1.2" "inherits" "~2.0.0" "mkdirp" ">=0.5 0" "rimraf" "2" "function-bind@^1.1.1": "integrity" "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" "resolved" "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz" "version" "1.1.1" "functional-red-black-tree@^1.0.1": "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" "resolved" "https://registry.nlark.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz?cache=0&sync_timestamp=1626768951311&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffunctional-red-black-tree%2Fdownload%2Ffunctional-red-black-tree-1.0.1.tgz" "version" "1.0.1" "gensync@^1.0.0-beta.2": "integrity" "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=" "resolved" "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz" "version" "1.0.0-beta.2" "get-intrinsic@^1.0.2", "get-intrinsic@^1.1.0", "get-intrinsic@^1.1.1": "integrity" "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=" "resolved" "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz" "version" "1.1.1" dependencies: "function-bind" "^1.1.1" "has" "^1.0.3" "has-symbols" "^1.0.1" "get-symbol-description@^1.0.0": "integrity" "sha1-f9uByQAQH71WTdXxowr1qtweWNY=" "resolved" "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz" "version" "1.0.0" dependencies: "call-bind" "^1.0.2" "get-intrinsic" "^1.1.1" "get-value@^2.0.3", "get-value@^2.0.6": "integrity" "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" "resolved" "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz" "version" "2.0.6" "glob-parent@^5.1.2", "glob-parent@~5.1.2": "integrity" "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=" "resolved" "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz" "version" "5.1.2" dependencies: "is-glob" "^4.0.1" "glob@^7.1.3": "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" "resolved" "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz" "version" "7.2.0" dependencies: "fs.realpath" "^1.0.0" "inflight" "^1.0.4" "inherits" "2" "minimatch" "^3.0.4" "once" "^1.3.0" "path-is-absolute" "^1.0.0" "globals@^11.1.0": "integrity" "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=" "resolved" "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz" "version" "11.12.0" "globals@^13.6.0", "globals@^13.9.0": "integrity" "sha1-TXM3YDBCMKAILtluIeXFZfiYCJ4=" "resolved" "https://registry.npmmirror.com/globals/download/globals-13.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-13.12.0.tgz" "version" "13.12.0" dependencies: "type-fest" "^0.20.2" "globby@^11.0.4": "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" "resolved" "https://registry.npmmirror.com/globby/download/globby-11.1.0.tgz" "version" "11.1.0" dependencies: "array-union" "^2.1.0" "dir-glob" "^3.0.1" "fast-glob" "^3.2.9" "ignore" "^5.2.0" "merge2" "^1.4.1" "slash" "^3.0.0" "graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.2": "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" "resolved" "https://registry.npmmirror.com/graceful-fs/download/graceful-fs-4.2.9.tgz" "version" "4.2.9" "has-ansi@^2.0.0": "integrity" "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" "resolved" "https://registry.nlark.com/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1631556755105&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz" "version" "2.0.0" dependencies: "ansi-regex" "^2.0.0" "has-bigints@^1.0.1": "integrity" "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=" "resolved" "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz" "version" "1.0.1" "has-flag@^1.0.0": "integrity" "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" "resolved" "https://registry.nlark.com/has-flag/download/has-flag-1.0.0.tgz" "version" "1.0.0" "has-flag@^3.0.0": "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" "resolved" "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz" "version" "3.0.0" "has-flag@^4.0.0": "integrity" "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" "resolved" "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz" "version" "4.0.0" "has-symbols@^1.0.1", "has-symbols@^1.0.2": "integrity" "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=" "resolved" "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz" "version" "1.0.2" "has-tostringtag@^1.0.0": "integrity" "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=" "resolved" "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz" "version" "1.0.0" dependencies: "has-symbols" "^1.0.2" "has-value@^0.3.1": "integrity" "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=" "resolved" "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz" "version" "0.3.1" dependencies: "get-value" "^2.0.3" "has-values" "^0.1.4" "isobject" "^2.0.0" "has-value@^1.0.0": "integrity" "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=" "resolved" "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz" "version" "1.0.0" dependencies: "get-value" "^2.0.6" "has-values" "^1.0.0" "isobject" "^3.0.0" "has-values@^0.1.4": "integrity" "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" "resolved" "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz" "version" "0.1.4" "has-values@^1.0.0": "integrity" "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=" "resolved" "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz" "version" "1.0.0" dependencies: "is-number" "^3.0.0" "kind-of" "^4.0.0" "has@^1.0.3": "integrity" "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=" "resolved" "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz" "version" "1.0.3" dependencies: "function-bind" "^1.1.1" "he@^1.1.1": "integrity" "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=" "resolved" "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz" "version" "1.2.0" "header-case@^2.0.4": "integrity" "sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=" "resolved" "https://registry.npm.taobao.org/header-case/download/header-case-2.0.4.tgz" "version" "2.0.4" dependencies: "capital-case" "^1.0.4" "tslib" "^2.0.3" "htmlparser2@^3.8.3": "integrity" "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=" "resolved" "https://registry.npmmirror.com/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640933377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz" "version" "3.10.1" dependencies: "domelementtype" "^1.3.1" "domhandler" "^2.3.0" "domutils" "^1.5.1" "entities" "^1.1.1" "inherits" "^2.0.1" "readable-stream" "^3.1.1" "ignore@^4.0.6": "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" "resolved" "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz" "version" "4.0.6" "ignore@^5.1.1", "ignore@^5.1.8", "ignore@^5.2.0": "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" "resolved" "https://registry.npmmirror.com/ignore/download/ignore-5.2.0.tgz" "version" "5.2.0" "image-size@^0.5.1": "integrity" "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=" "resolved" "https://registry.npmmirror.com/image-size/download/image-size-0.5.5.tgz" "version" "0.5.5" "immutable@^4.0.0": "integrity" "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" "resolved" "https://registry.npmmirror.com/immutable/download/immutable-4.0.0.tgz" "version" "4.0.0" "import-fresh@^3.0.0", "import-fresh@^3.2.1": "integrity" "sha1-NxYsJfy566oublPVtNiM4X2eDCs=" "resolved" "https://registry.nlark.com/import-fresh/download/import-fresh-3.3.0.tgz" "version" "3.3.0" dependencies: "parent-module" "^1.0.0" "resolve-from" "^4.0.0" "imurmurhash@^0.1.4": "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" "resolved" "https://registry.nlark.com/imurmurhash/download/imurmurhash-0.1.4.tgz" "version" "0.1.4" "inflight@^1.0.4": "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" "resolved" "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz" "version" "1.0.6" dependencies: "once" "^1.3.0" "wrappy" "1" "inherits@^2.0.1", "inherits@^2.0.3", "inherits@~2.0.0", "inherits@~2.0.3", "inherits@2": "integrity" "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" "resolved" "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz" "version" "2.0.4" "internal-slot@^1.0.3": "integrity" "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=" "resolved" "https://registry.npm.taobao.org/internal-slot/download/internal-slot-1.0.3.tgz?cache=0&sync_timestamp=1611694392178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finternal-slot%2Fdownload%2Finternal-slot-1.0.3.tgz" "version" "1.0.3" dependencies: "get-intrinsic" "^1.1.0" "has" "^1.0.3" "side-channel" "^1.0.4" "is-accessor-descriptor@^0.1.6": "integrity" "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=" "resolved" "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz" "version" "0.1.6" dependencies: "kind-of" "^3.0.2" "is-accessor-descriptor@^1.0.0": "integrity" "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=" "resolved" "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz" "version" "1.0.0" dependencies: "kind-of" "^6.0.0" "is-bigint@^1.0.1": "integrity" "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=" "resolved" "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz" "version" "1.0.4" dependencies: "has-bigints" "^1.0.1" "is-binary-path@~2.1.0": "integrity" "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=" "resolved" "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz" "version" "2.1.0" dependencies: "binary-extensions" "^2.0.0" "is-boolean-object@^1.1.0": "integrity" "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=" "resolved" "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz" "version" "1.1.2" dependencies: "call-bind" "^1.0.2" "has-tostringtag" "^1.0.0" "is-buffer@^1.1.5": "integrity" "sha1-76ouqdqg16suoTqXsritUf776L4=" "resolved" "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429452232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz" "version" "1.1.6" "is-callable@^1.1.4", "is-callable@^1.2.4": "integrity" "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=" "resolved" "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz" "version" "1.2.4" "is-core-module@^2.8.0": "integrity" "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==" "resolved" "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.1.tgz" "version" "2.8.1" dependencies: "has" "^1.0.3" "is-data-descriptor@^0.1.4": "integrity" "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=" "resolved" "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz" "version" "0.1.4" dependencies: "kind-of" "^3.0.2" "is-data-descriptor@^1.0.0": "integrity" "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=" "resolved" "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz" "version" "1.0.0" dependencies: "kind-of" "^6.0.0" "is-date-object@^1.0.1": "integrity" "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=" "resolved" "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz" "version" "1.0.5" dependencies: "has-tostringtag" "^1.0.0" "is-descriptor@^0.1.0": "integrity" "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=" "resolved" "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz" "version" "0.1.6" dependencies: "is-accessor-descriptor" "^0.1.6" "is-data-descriptor" "^0.1.4" "kind-of" "^5.0.0" "is-descriptor@^1.0.0", "is-descriptor@^1.0.2": "integrity" "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=" "resolved" "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz" "version" "1.0.2" dependencies: "is-accessor-descriptor" "^1.0.0" "is-data-descriptor" "^1.0.0" "kind-of" "^6.0.2" "is-extendable@^0.1.0", "is-extendable@^0.1.1": "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" "resolved" "https://registry.nlark.com/is-extendable/download/is-extendable-0.1.1.tgz" "version" "0.1.1" "is-extendable@^1.0.1": "integrity" "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=" "resolved" "https://registry.nlark.com/is-extendable/download/is-extendable-1.0.1.tgz" "version" "1.0.1" dependencies: "is-plain-object" "^2.0.4" "is-extglob@^2.1.1": "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" "resolved" "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz" "version" "2.1.1" "is-fullwidth-code-point@^3.0.0": "integrity" "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" "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" "version" "3.0.0" "is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": "integrity" "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=" "resolved" "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz" "version" "4.0.3" dependencies: "is-extglob" "^2.1.1" "is-negative-zero@^2.0.1": "integrity" "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" "resolved" "https://registry.npmmirror.com/is-negative-zero/download/is-negative-zero-2.0.2.tgz" "version" "2.0.2" "is-number-object@^1.0.4": "integrity" "sha1-anqvg4x/BoalC0VT9+VKlklOifA=" "resolved" "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz" "version" "1.0.6" dependencies: "has-tostringtag" "^1.0.0" "is-number@^3.0.0": "integrity" "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=" "resolved" "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz" "version" "3.0.0" dependencies: "kind-of" "^3.0.2" "is-number@^7.0.0": "integrity" "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" "resolved" "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz" "version" "7.0.0" "is-plain-obj@^1.1": "integrity" "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" "resolved" "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618600489644&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz" "version" "1.1.0" "is-plain-object@^2.0.3": "integrity" "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=" "resolved" "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz" "version" "2.0.4" dependencies: "isobject" "^3.0.1" "is-plain-object@^2.0.4": "integrity" "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=" "resolved" "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz" "version" "2.0.4" dependencies: "isobject" "^3.0.1" "is-plain-object@3.0.1": "integrity" "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=" "resolved" "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz" "version" "3.0.1" "is-reference@^1.2.1": "integrity" "sha1-iy2sCzcfS8mU/eq6nrVC0DAC0Lc=" "resolved" "https://registry.nlark.com/is-reference/download/is-reference-1.2.1.tgz" "version" "1.2.1" dependencies: "@types/estree" "*" "is-regex@^1.1.4": "integrity" "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=" "resolved" "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz" "version" "1.1.4" dependencies: "call-bind" "^1.0.2" "has-tostringtag" "^1.0.0" "is-shared-array-buffer@^1.0.1": "integrity" "sha1-l7DIX72stZycRG/mU7gs8rW3z+Y=" "resolved" "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz" "version" "1.0.1" "is-string@^1.0.5", "is-string@^1.0.7": "integrity" "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=" "resolved" "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz" "version" "1.0.7" dependencies: "has-tostringtag" "^1.0.0" "is-symbol@^1.0.2", "is-symbol@^1.0.3": "integrity" "sha1-ptrJO2NbBjymhyI23oiRClevE5w=" "resolved" "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501174327&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz" "version" "1.0.4" dependencies: "has-symbols" "^1.0.2" "is-weakref@^1.0.1": "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==" "resolved" "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz" "version" "1.0.2" dependencies: "call-bind" "^1.0.2" "is-windows@^1.0.2": "integrity" "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" "resolved" "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz" "version" "1.0.2" "isarray@~1.0.0", "isarray@1.0.0": "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" "resolved" "https://registry.nlark.com/isarray/download/isarray-1.0.0.tgz" "version" "1.0.0" "isexe@^2.0.0": "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" "resolved" "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz" "version" "2.0.0" "isobject@^2.0.0": "integrity" "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==" "resolved" "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz" "version" "2.1.0" dependencies: "isarray" "1.0.0" "isobject@^2.1.0": "integrity" "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==" "resolved" "https://registry.npmmirror.com/isobject/download/isobject-2.1.0.tgz" "version" "2.1.0" dependencies: "isarray" "1.0.0" "isobject@^3.0.0": "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" "resolved" "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz" "version" "3.0.1" "isobject@^3.0.1": "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" "resolved" "https://registry.npmmirror.com/isobject/download/isobject-3.0.1.tgz" "version" "3.0.1" "js-base64@^2.1.9": "integrity" "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" "resolved" "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz" "version" "2.6.4" "js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": "integrity" "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" "resolved" "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz" "version" "4.0.0" "js-yaml@^3.13.1": "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" "resolved" "https://registry.npmmirror.com/js-yaml/download/js-yaml-3.14.1.tgz" "version" "3.14.1" dependencies: "argparse" "^1.0.7" "esprima" "^4.0.0" "jsesc@^2.5.1": "integrity" "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=" "resolved" "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891232110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz" "version" "2.5.2" "json-schema-traverse@^0.4.1": "integrity" "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" "resolved" "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1607999852153&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz" "version" "0.4.1" "json-schema-traverse@^1.0.0": "integrity" "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=" "resolved" "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz?cache=0&sync_timestamp=1607999852153&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-1.0.0.tgz" "version" "1.0.0" "json-stable-stringify-without-jsonify@^1.0.1": "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" "resolved" "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz" "version" "1.0.1" "json5@^1.0.1": "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" "resolved" "https://registry.npmmirror.com/json5/download/json5-1.0.1.tgz" "version" "1.0.1" dependencies: "minimist" "^1.2.0" "json5@^2.1.2": "integrity" "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==" "resolved" "https://registry.npmmirror.com/json5/download/json5-2.2.0.tgz" "version" "2.2.0" dependencies: "minimist" "^1.2.5" "jsonfile@^6.0.1": "integrity" "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=" "resolved" "https://registry.nlark.com/jsonfile/download/jsonfile-6.1.0.tgz" "version" "6.1.0" dependencies: "universalify" "^2.0.0" optionalDependencies: "graceful-fs" "^4.1.6" "kind-of@^3.0.2", "kind-of@^3.0.3": "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz" "version" "3.2.2" dependencies: "is-buffer" "^1.1.5" "kind-of@^3.2.0": "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz" "version" "3.2.2" dependencies: "is-buffer" "^1.1.5" "kind-of@^4.0.0": "integrity" "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=" "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz" "version" "4.0.0" dependencies: "is-buffer" "^1.1.5" "kind-of@^5.0.0", "kind-of@^5.0.2": "integrity" "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz" "version" "5.1.0" "kind-of@^6.0.0": "integrity" "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz" "version" "6.0.3" "kind-of@^6.0.2": "integrity" "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" "resolved" "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz" "version" "6.0.3" "levn@^0.4.1": "integrity" "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=" "resolved" "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz" "version" "0.4.1" dependencies: "prelude-ls" "^1.2.1" "type-check" "~0.4.0" "listenercount@~1.0.1": "integrity" "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" "resolved" "https://registry.npm.taobao.org/listenercount/download/listenercount-1.0.1.tgz" "version" "1.0.1" "loader-utils@^1.1.0": "integrity" "sha1-xXm140yzSxp07cbB+za/o3HVphM=" "resolved" "https://registry.npmmirror.com/loader-utils/download/loader-utils-1.4.0.tgz" "version" "1.4.0" dependencies: "big.js" "^5.2.2" "emojis-list" "^3.0.0" "json5" "^1.0.1" "locate-path@^2.0.0": "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" "resolved" "https://registry.nlark.com/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz" "version" "2.0.0" dependencies: "p-locate" "^2.0.0" "path-exists" "^3.0.0" "lodash-es@^4.17.15": "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" "resolved" "https://registry.npmmirror.com/lodash-es/download/lodash-es-4.17.21.tgz" "version" "4.17.21" "lodash.merge@^4.6.2": "integrity" "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=" "resolved" "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz" "version" "4.6.2" "lodash.truncate@^4.4.2": "integrity" "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" "resolved" "https://registry.nlark.com/lodash.truncate/download/lodash.truncate-4.4.2.tgz" "version" "4.4.2" "lodash@^4.17.15", "lodash@^4.17.21": "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" "resolved" "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz" "version" "4.17.21" "loose-envify@^1.0.0": "integrity" "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=" "resolved" "https://registry.nlark.com/loose-envify/download/loose-envify-1.4.0.tgz?cache=0&sync_timestamp=1631633000868&other_urls=https%3A%2F%2Fregistry.nlark.com%2Floose-envify%2Fdownload%2Floose-envify-1.4.0.tgz" "version" "1.4.0" dependencies: "js-tokens" "^3.0.0 || ^4.0.0" "lower-case@^2.0.2": "integrity" "sha1-b6I3xj29xKgsoP2ILkci3F5jTig=" "resolved" "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1606867333511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz" "version" "2.0.2" dependencies: "tslib" "^2.0.3" "lru-cache@^6.0.0": "integrity" "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=" "resolved" "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz?cache=0&sync_timestamp=1599054167787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-6.0.0.tgz" "version" "6.0.0" dependencies: "yallist" "^4.0.0" "magic-string@^0.25.7": "integrity" "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=" "resolved" "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz" "version" "0.25.7" dependencies: "sourcemap-codec" "^1.4.4" "map-cache@^0.2.2": "integrity" "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" "resolved" "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz" "version" "0.2.2" "map-visit@^1.0.0": "integrity" "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=" "resolved" "https://registry.nlark.com/map-visit/download/map-visit-1.0.0.tgz" "version" "1.0.0" dependencies: "object-visit" "^1.0.0" "mdn-data@2.0.14": "integrity" "sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=" "resolved" "https://registry.npmmirror.com/mdn-data/download/mdn-data-2.0.14.tgz" "version" "2.0.14" "merge-options@1.0.1": "integrity" "sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=" "resolved" "https://registry.npm.taobao.org/merge-options/download/merge-options-1.0.1.tgz" "version" "1.0.1" dependencies: "is-plain-obj" "^1.1" "merge2@^1.3.0", "merge2@^1.4.1": "integrity" "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=" "resolved" "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz" "version" "1.4.1" "micromatch@^4.0.4": "integrity" "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=" "resolved" "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz" "version" "4.0.4" dependencies: "braces" "^3.0.1" "picomatch" "^2.2.3" "micromatch@3.1.0": "integrity" "sha1-UQLU6vILaZfWAI46z+HESj+oFeI=" "resolved" "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.0.tgz?cache=0&sync_timestamp=1618054740956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.0.tgz" "version" "3.1.0" dependencies: "arr-diff" "^4.0.0" "array-unique" "^0.3.2" "braces" "^2.2.2" "define-property" "^1.0.0" "extend-shallow" "^2.0.1" "extglob" "^2.0.2" "fragment-cache" "^0.2.1" "kind-of" "^5.0.2" "nanomatch" "^1.2.1" "object.pick" "^1.3.0" "regex-not" "^1.0.0" "snapdragon" "^0.8.1" "to-regex" "^3.0.1" "minimatch@^3.0.4": "integrity" "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" "resolved" "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz" "version" "3.0.4" dependencies: "brace-expansion" "^1.1.7" "minimist@^1.2.0", "minimist@^1.2.5": "integrity" "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" "resolved" "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz" "version" "1.2.5" "mixin-deep@^1.2.0": "integrity" "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=" "resolved" "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz" "version" "1.3.2" dependencies: "for-in" "^1.0.2" "is-extendable" "^1.0.1" "mkdirp@>=0.5 0": "integrity" "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=" "resolved" "https://registry.npmmirror.com/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1636300883420&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz" "version" "0.5.5" dependencies: "minimist" "^1.2.5" "moment@^2.27.0": "integrity" "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" "resolved" "https://registry.npmmirror.com/moment/download/moment-2.29.1.tgz" "version" "2.29.1" "ms@^2.1.1", "ms@2.1.2": "integrity" "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" "resolved" "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz" "version" "2.1.2" "ms@2.0.0": "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "resolved" "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz" "version" "2.0.0" "mutation-observer@^1.0.3": "integrity" "sha1-QukiKxAbyoLlup1aes9KFMDyY9A=" "resolved" "https://registry.npm.taobao.org/mutation-observer/download/mutation-observer-1.0.3.tgz" "version" "1.0.3" "nanoid@^3.1.30": "integrity" "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==" "resolved" "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.31.tgz" "version" "3.1.31" "nanomatch@^1.2.1": "integrity" "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=" "resolved" "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz" "version" "1.2.13" dependencies: "arr-diff" "^4.0.0" "array-unique" "^0.3.2" "define-property" "^2.0.2" "extend-shallow" "^3.0.2" "fragment-cache" "^0.2.1" "is-windows" "^1.0.2" "kind-of" "^6.0.2" "object.pick" "^1.3.0" "regex-not" "^1.0.0" "snapdragon" "^0.8.1" "to-regex" "^3.0.1" "nanopop@^2.1.0": "integrity" "sha1-I0dlE87iQFiIr9LopLVAZrcLnmA=" "resolved" "https://registry.npm.taobao.org/nanopop/download/nanopop-2.1.0.tgz" "version" "2.1.0" "natural-compare@^1.4.0": "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" "resolved" "https://registry.nlark.com/natural-compare/download/natural-compare-1.4.0.tgz" "version" "1.4.0" "no-case@^3.0.4": "integrity" "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=" "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" "version" "3.0.4" dependencies: "lower-case" "^2.0.2" "tslib" "^2.0.3" "node-releases@^2.0.1": "integrity" "sha1-PR05XyBPHy8ppUNYuftnh2WtL8U=" "resolved" "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz" "version" "2.0.1" "normalize-path@^3.0.0", "normalize-path@~3.0.0": "integrity" "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=" "resolved" "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz" "version" "3.0.0" "nth-check@^2.0.1": "integrity" "sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=" "resolved" "https://registry.nlark.com/nth-check/download/nth-check-2.0.1.tgz?cache=0&sync_timestamp=1631793617973&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnth-check%2Fdownload%2Fnth-check-2.0.1.tgz" "version" "2.0.1" dependencies: "boolbase" "^1.0.0" "object-assign@^4", "object-assign@^4.1.0": "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" "resolved" "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz" "version" "4.1.1" "object-copy@^0.1.0": "integrity" "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=" "resolved" "https://registry.nlark.com/object-copy/download/object-copy-0.1.0.tgz" "version" "0.1.0" dependencies: "copy-descriptor" "^0.1.0" "define-property" "^0.2.5" "kind-of" "^3.0.3" "object-inspect@^1.11.0", "object-inspect@^1.9.0": "integrity" "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" "resolved" "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.12.0.tgz" "version" "1.12.0" "object-keys@^1.0.12", "object-keys@^1.1.1": "integrity" "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" "resolved" "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz" "version" "1.1.1" "object-visit@^1.0.0": "integrity" "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=" "resolved" "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz" "version" "1.0.1" dependencies: "isobject" "^3.0.0" "object.assign@^4.1.2": "integrity" "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=" "resolved" "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115158081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz" "version" "4.1.2" dependencies: "call-bind" "^1.0.0" "define-properties" "^1.1.3" "has-symbols" "^1.0.1" "object-keys" "^1.1.1" "object.pick@^1.3.0": "integrity" "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=" "resolved" "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz" "version" "1.3.0" dependencies: "isobject" "^3.0.1" "object.values@^1.1.5": "integrity" "sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw=" "resolved" "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz" "version" "1.1.5" dependencies: "call-bind" "^1.0.2" "define-properties" "^1.1.3" "es-abstract" "^1.19.1" "omit.js@^2.0.0": "integrity" "sha1-3ZuENvq5R6Xz/yFMslOGMeMT7C8=" "resolved" "https://registry.npm.taobao.org/omit.js/download/omit.js-2.0.2.tgz" "version" "2.0.2" "once@^1.3.0": "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" "resolved" "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz" "version" "1.4.0" dependencies: "wrappy" "1" "optionator@^0.9.1": "integrity" "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=" "resolved" "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz" "version" "0.9.1" dependencies: "deep-is" "^0.1.3" "fast-levenshtein" "^2.0.6" "levn" "^0.4.1" "prelude-ls" "^1.2.1" "type-check" "^0.4.0" "word-wrap" "^1.2.3" "p-limit@^1.1.0": "integrity" "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=" "resolved" "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz" "version" "1.3.0" dependencies: "p-try" "^1.0.0" "p-locate@^2.0.0": "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" "resolved" "https://registry.nlark.com/p-locate/download/p-locate-2.0.0.tgz?cache=0&sync_timestamp=1629892721671&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-2.0.0.tgz" "version" "2.0.0" dependencies: "p-limit" "^1.1.0" "p-try@^1.0.0": "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" "resolved" "https://registry.npmmirror.com/p-try/download/p-try-1.0.0.tgz?cache=0&sync_timestamp=1633364462890&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-1.0.0.tgz" "version" "1.0.0" "param-case@^3.0.4": "integrity" "sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=" "resolved" "https://registry.npm.taobao.org/param-case/download/param-case-3.0.4.tgz?cache=0&sync_timestamp=1606867292797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-3.0.4.tgz" "version" "3.0.4" dependencies: "dot-case" "^3.0.4" "tslib" "^2.0.3" "parent-module@^1.0.0": "integrity" "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=" "resolved" "https://registry.npmmirror.com/parent-module/download/parent-module-1.0.1.tgz" "version" "1.0.1" dependencies: "callsites" "^3.0.0" "pascal-case@^3.1.2": "integrity" "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=" "resolved" "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz?cache=0&sync_timestamp=1606867325163&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpascal-case%2Fdownload%2Fpascal-case-3.1.2.tgz" "version" "3.1.2" dependencies: "no-case" "^3.0.4" "tslib" "^2.0.3" "pascalcase@^0.1.1": "integrity" "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" "resolved" "https://registry.npmmirror.com/pascalcase/download/pascalcase-0.1.1.tgz" "version" "0.1.1" "path-case@^3.0.4": "integrity" "sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=" "resolved" "https://registry.npm.taobao.org/path-case/download/path-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325967&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-case%2Fdownload%2Fpath-case-3.0.4.tgz" "version" "3.0.4" dependencies: "dot-case" "^3.0.4" "tslib" "^2.0.3" "path-exists@^3.0.0": "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" "resolved" "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz" "version" "3.0.0" "path-is-absolute@^1.0.0": "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" "resolved" "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz" "version" "1.0.1" "path-key@^3.1.0": "integrity" "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=" "resolved" "https://registry.npmmirror.com/path-key/download/path-key-3.1.1.tgz" "version" "3.1.1" "path-parse@^1.0.7": "integrity" "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=" "resolved" "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz" "version" "1.0.7" "path-type@^4.0.0": "integrity" "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=" "resolved" "https://registry.nlark.com/path-type/download/path-type-4.0.0.tgz" "version" "4.0.0" "picocolors@^1.0.0": "integrity" "sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=" "resolved" "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz?cache=0&sync_timestamp=1634093442271&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpicocolors%2Fdownload%2Fpicocolors-1.0.0.tgz" "version" "1.0.0" "picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.2", "picomatch@^2.2.3": "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" "resolved" "https://registry.npmmirror.com/picomatch/download/picomatch-2.3.1.tgz" "version" "2.3.1" "posix-character-classes@^0.1.0": "integrity" "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" "resolved" "https://registry.npmmirror.com/posix-character-classes/download/posix-character-classes-0.1.1.tgz" "version" "0.1.1" "postcss-prefix-selector@^1.6.0": "integrity" "sha512-8d5fiBQZWMtGWH/7ewEeo6RnBNyT2kLD5wTIfV2oHYqH4hjiofg/rP5X3SUwnqOINzE4mM/K/UOAiNrIaKzd4w==" "resolved" "https://registry.npmmirror.com/postcss-prefix-selector/download/postcss-prefix-selector-1.14.0.tgz" "version" "1.14.0" "postcss@^5.2.17": "integrity" "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==" "resolved" "https://registry.npmmirror.com/postcss/download/postcss-5.2.18.tgz" "version" "5.2.18" dependencies: "chalk" "^1.1.3" "js-base64" "^2.1.9" "source-map" "^0.5.6" "supports-color" "^3.2.3" "postcss@^8.1.10", "postcss@^8.4.5", "postcss@7.x || 8.x": "integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==" "resolved" "https://registry.npmmirror.com/postcss/download/postcss-8.4.5.tgz" "version" "8.4.5" dependencies: "nanoid" "^3.1.30" "picocolors" "^1.0.0" "source-map-js" "^1.0.1" "posthtml-parser@^0.2.0", "posthtml-parser@^0.2.1": "integrity" "sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=" "resolved" "https://registry.nlark.com/posthtml-parser/download/posthtml-parser-0.2.1.tgz" "version" "0.2.1" dependencies: "htmlparser2" "^3.8.3" "isobject" "^2.1.0" "posthtml-rename-id@^1.0": "integrity" "sha1-z39us3FGvxr6wx5o8YxswZrmFDM=" "resolved" "https://registry.npm.taobao.org/posthtml-rename-id/download/posthtml-rename-id-1.0.12.tgz" "version" "1.0.12" dependencies: "escape-string-regexp" "1.0.5" "posthtml-render@^1.0.5", "posthtml-render@^1.0.6": "integrity" "sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM=" "resolved" "https://registry.nlark.com/posthtml-render/download/posthtml-render-1.4.0.tgz" "version" "1.4.0" "posthtml-svg-mode@^1.0.3": "integrity" "sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA=" "resolved" "https://registry.npm.taobao.org/posthtml-svg-mode/download/posthtml-svg-mode-1.0.3.tgz" "version" "1.0.3" dependencies: "merge-options" "1.0.1" "posthtml" "^0.9.2" "posthtml-parser" "^0.2.1" "posthtml-render" "^1.0.6" "posthtml@^0.9.2": "integrity" "sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=" "resolved" "https://registry.nlark.com/posthtml/download/posthtml-0.9.2.tgz?cache=0&sync_timestamp=1627459255104&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fposthtml%2Fdownload%2Fposthtml-0.9.2.tgz" "version" "0.9.2" dependencies: "posthtml-parser" "^0.2.0" "posthtml-render" "^1.0.5" "prelude-ls@^1.2.1": "integrity" "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=" "resolved" "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz" "version" "1.2.1" "process-nextick-args@~2.0.0": "integrity" "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" "resolved" "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz" "version" "2.0.1" "progress@^2.0.0": "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" "resolved" "https://registry.npmmirror.com/progress/download/progress-2.0.3.tgz" "version" "2.0.3" "punycode@^2.1.0": "integrity" "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" "resolved" "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz" "version" "2.1.1" "query-string@^4.3.2": "integrity" "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=" "resolved" "https://registry.npmmirror.com/query-string/download/query-string-4.3.4.tgz" "version" "4.3.4" dependencies: "object-assign" "^4.1.0" "strict-uri-encode" "^1.0.0" "query-string@^7.0.1": "integrity" "sha512-wnJ8covk+S9isYR5JIXPt93kFUmI2fQ4R/8130fuq+qwLiGVTurg7Klodgfw4NSz/oe7xnyi09y3lSrogUeM3g==" "resolved" "https://registry.npmmirror.com/query-string/download/query-string-7.1.0.tgz" "version" "7.1.0" dependencies: "decode-uri-component" "^0.2.0" "filter-obj" "^1.1.0" "split-on-first" "^1.0.0" "strict-uri-encode" "^2.0.0" "queue-microtask@^1.2.2": "integrity" "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=" "resolved" "https://registry.npm.taobao.org/queue-microtask/download/queue-microtask-1.2.3.tgz?cache=0&sync_timestamp=1616391641179&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqueue-microtask%2Fdownload%2Fqueue-microtask-1.2.3.tgz" "version" "1.2.3" "readable-stream@^2.0.2": "integrity" "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=" "resolved" "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz" "version" "2.3.7" 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@^3.1.1": "integrity" "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=" "resolved" "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz" "version" "3.6.0" dependencies: "inherits" "^2.0.3" "string_decoder" "^1.1.1" "util-deprecate" "^1.0.1" "readable-stream@~2.3.6": "integrity" "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=" "resolved" "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz" "version" "2.3.7" 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" "readdirp@~3.6.0": "integrity" "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=" "resolved" "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.6.0.tgz" "version" "3.6.0" dependencies: "picomatch" "^2.2.1" "reconnecting-websocket@^4.4.0": "integrity" "sha1-Ow5blu8RnnigMTWGW4uwrxuUh4M=" "resolved" "https://registry.npmmirror.com/reconnecting-websocket/download/reconnecting-websocket-4.4.0.tgz" "version" "4.4.0" "regenerator-runtime@^0.13.4", "regenerator-runtime@^0.13.9": "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" "resolved" "https://registry.npmmirror.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz" "version" "0.13.9" "regex-not@^1.0.0", "regex-not@^1.0.2": "integrity" "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=" "resolved" "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz" "version" "1.0.2" dependencies: "extend-shallow" "^3.0.2" "safe-regex" "^1.1.0" "regexpp@^3.0.0", "regexpp@^3.1.0", "regexpp@^3.2.0": "integrity" "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=" "resolved" "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz" "version" "3.2.0" "repeat-element@^1.1.2": "integrity" "sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=" "resolved" "https://registry.nlark.com/repeat-element/download/repeat-element-1.1.4.tgz" "version" "1.1.4" "repeat-string@^1.6.1": "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" "resolved" "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz?cache=0&sync_timestamp=1589682793094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frepeat-string%2Fdownload%2Frepeat-string-1.6.1.tgz" "version" "1.6.1" "require-from-string@^2.0.2": "integrity" "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=" "resolved" "https://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz" "version" "2.0.2" "resize-observer-polyfill@^1.5.1": "integrity" "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=" "resolved" "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz" "version" "1.5.1" "resolve-from@^4.0.0": "integrity" "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=" "resolved" "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz" "version" "4.0.0" "resolve-url@^0.2.1": "integrity" "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" "resolved" "https://registry.npmmirror.com/resolve-url/download/resolve-url-0.2.1.tgz" "version" "0.2.1" "resolve@^1.10.1", "resolve@^1.20.0": "integrity" "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==" "resolved" "https://registry.npmmirror.com/resolve/download/resolve-1.21.0.tgz" "version" "1.21.0" dependencies: "is-core-module" "^2.8.0" "path-parse" "^1.0.7" "supports-preserve-symlinks-flag" "^1.0.0" "ret@~0.1.10": "integrity" "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" "resolved" "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz" "version" "0.1.15" "reusify@^1.0.4": "integrity" "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=" "resolved" "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz" "version" "1.0.4" "rimraf@^3.0.2": "integrity" "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=" "resolved" "https://registry.npmmirror.com/rimraf/download/rimraf-3.0.2.tgz" "version" "3.0.2" dependencies: "glob" "^7.1.3" "rimraf@2": "integrity" "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=" "resolved" "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz" "version" "2.7.1" dependencies: "glob" "^7.1.3" "rollup-plugin-external-globals@^0.6.1": "integrity" "sha1-hhwmC1cnFE4P0bQksQP58Cgvw2U=" "resolved" "https://registry.nlark.com/rollup-plugin-external-globals/download/rollup-plugin-external-globals-0.6.1.tgz" "version" "0.6.1" dependencies: "@rollup/pluginutils" "^4.0.0" "estree-walker" "^2.0.1" "is-reference" "^1.2.1" "magic-string" "^0.25.7" "rollup@^2.25.0", "rollup@^2.47.0", "rollup@^2.59.0": "integrity" "sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==" "resolved" "https://registry.npmmirror.com/rollup/-/rollup-2.68.0.tgz" "version" "2.68.0" optionalDependencies: "fsevents" "~2.3.2" "run-parallel@^1.1.9": "integrity" "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=" "resolved" "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925943325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz" "version" "1.2.0" dependencies: "queue-microtask" "^1.2.2" "safe-buffer@~5.1.0", "safe-buffer@~5.1.1": "integrity" "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" "resolved" "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz" "version" "5.1.2" "safe-buffer@~5.2.0": "integrity" "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" "resolved" "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz" "version" "5.2.1" "safe-regex@^1.1.0": "integrity" "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=" "resolved" "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz" "version" "1.1.0" dependencies: "ret" "~0.1.10" "sass@*", "sass@^1.35.1": "integrity" "sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==" "resolved" "https://registry.npmmirror.com/sass/download/sass-1.47.0.tgz" "version" "1.47.0" dependencies: "chokidar" ">=3.0.0 <4.0.0" "immutable" "^4.0.0" "source-map-js" ">=0.6.2 <2.0.0" "scroll-into-view-if-needed@^2.2.25": "integrity" "sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo=" "resolved" "https://registry.npmmirror.com/scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz" "version" "2.2.28" dependencies: "compute-scroll-into-view" "^1.0.17" "semver@^6.1.0": "integrity" "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" "resolved" "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz" "version" "6.3.0" "semver@^6.3.0": "integrity" "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" "resolved" "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz" "version" "6.3.0" "semver@^7.2.1", "semver@^7.3.5": "integrity" "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=" "resolved" "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz" "version" "7.3.5" dependencies: "lru-cache" "^6.0.0" "sentence-case@^3.0.4": "integrity" "sha1-NkWnuMEXx4f96HAgViJbtipFEx8=" "resolved" "https://registry.npm.taobao.org/sentence-case/download/sentence-case-3.0.4.tgz?cache=0&sync_timestamp=1606867325535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsentence-case%2Fdownload%2Fsentence-case-3.0.4.tgz" "version" "3.0.4" dependencies: "no-case" "^3.0.4" "tslib" "^2.0.3" "upper-case-first" "^2.0.2" "set-value@^2.0.0", "set-value@^2.0.1": "integrity" "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=" "resolved" "https://registry.nlark.com/set-value/download/set-value-2.0.1.tgz" "version" "2.0.1" dependencies: "extend-shallow" "^2.0.1" "is-extendable" "^0.1.1" "is-plain-object" "^2.0.3" "split-string" "^3.0.1" "setimmediate@~1.0.4": "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" "resolved" "https://registry.npmmirror.com/setimmediate/download/setimmediate-1.0.5.tgz" "version" "1.0.5" "shallow-equal@^1.0.0": "integrity" "sha1-TBar+lYEOqINBQMk76aJQLDaedo=" "resolved" "https://registry.npm.taobao.org/shallow-equal/download/shallow-equal-1.2.1.tgz" "version" "1.2.1" "shebang-command@^2.0.0": "integrity" "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=" "resolved" "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz" "version" "2.0.0" dependencies: "shebang-regex" "^3.0.0" "shebang-regex@^3.0.0": "integrity" "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=" "resolved" "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz" "version" "3.0.0" "side-channel@^1.0.4": "integrity" "sha1-785cj9wQTudRslxY1CkAEfpeos8=" "resolved" "https://registry.npm.taobao.org/side-channel/download/side-channel-1.0.4.tgz?cache=0&sync_timestamp=1609270210432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fside-channel%2Fdownload%2Fside-channel-1.0.4.tgz" "version" "1.0.4" dependencies: "call-bind" "^1.0.0" "get-intrinsic" "^1.0.2" "object-inspect" "^1.9.0" "slash@^3.0.0": "integrity" "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=" "resolved" "https://registry.nlark.com/slash/download/slash-3.0.0.tgz" "version" "3.0.0" "slice-ansi@^4.0.0": "integrity" "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=" "resolved" "https://registry.nlark.com/slice-ansi/download/slice-ansi-4.0.0.tgz" "version" "4.0.0" dependencies: "ansi-styles" "^4.0.0" "astral-regex" "^2.0.0" "is-fullwidth-code-point" "^3.0.0" "snake-case@^3.0.4": "integrity" "sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=" "resolved" "https://registry.npm.taobao.org/snake-case/download/snake-case-3.0.4.tgz?cache=0&sync_timestamp=1606867326057&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsnake-case%2Fdownload%2Fsnake-case-3.0.4.tgz" "version" "3.0.4" dependencies: "dot-case" "^3.0.4" "tslib" "^2.0.3" "snapdragon-node@^2.0.1": "integrity" "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=" "resolved" "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz" "version" "2.1.1" dependencies: "define-property" "^1.0.0" "isobject" "^3.0.0" "snapdragon-util" "^3.0.1" "snapdragon-util@^3.0.1": "integrity" "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=" "resolved" "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz" "version" "3.0.1" dependencies: "kind-of" "^3.2.0" "snapdragon@^0.8.1": "integrity" "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=" "resolved" "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz" "version" "0.8.2" dependencies: "base" "^0.11.1" "debug" "^2.2.0" "define-property" "^0.2.5" "extend-shallow" "^2.0.1" "map-cache" "^0.2.2" "source-map" "^0.5.6" "source-map-resolve" "^0.5.0" "use" "^3.1.0" "source-map-js@^1.0.1", "source-map-js@>=0.6.2 <2.0.0": "integrity" "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" "resolved" "https://registry.npmmirror.com/source-map-js/download/source-map-js-1.0.1.tgz" "version" "1.0.1" "source-map-resolve@^0.5.0": "integrity" "sha1-GQhmvs51U+H48mei7oLGBrVQmho=" "resolved" "https://registry.npmmirror.com/source-map-resolve/download/source-map-resolve-0.5.3.tgz" "version" "0.5.3" dependencies: "atob" "^2.1.2" "decode-uri-component" "^0.2.0" "resolve-url" "^0.2.1" "source-map-url" "^0.4.0" "urix" "^0.1.0" "source-map-url@^0.4.0": "integrity" "sha1-CvZmBadFpaL5HPG7+KevvCg97FY=" "resolved" "https://registry.npmmirror.com/source-map-url/download/source-map-url-0.4.1.tgz" "version" "0.4.1" "source-map@^0.5.0": "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" "resolved" "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz" "version" "0.5.7" "source-map@^0.5.6": "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" "resolved" "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz" "version" "0.5.7" "source-map@^0.6.1", "source-map@0.6.1": "integrity" "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" "resolved" "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz" "version" "0.6.1" "sourcemap-codec@^1.4.4": "integrity" "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=" "resolved" "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz" "version" "1.4.8" "split-on-first@^1.0.0": "integrity" "sha1-9hCv7uOxK84dDDBCXnY5i3gkml8=" "resolved" "https://registry.npm.taobao.org/split-on-first/download/split-on-first-1.1.0.tgz?cache=0&sync_timestamp=1618467042029&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsplit-on-first%2Fdownload%2Fsplit-on-first-1.1.0.tgz" "version" "1.1.0" "split-string@^3.0.1", "split-string@^3.0.2": "integrity" "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=" "resolved" "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz" "version" "3.1.0" dependencies: "extend-shallow" "^3.0.0" "sprintf-js@~1.0.2": "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" "resolved" "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz" "version" "1.0.3" "stable@^0.1.8": "integrity" "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=" "resolved" "https://registry.npmmirror.com/stable/download/stable-0.1.8.tgz" "version" "0.1.8" "static-extend@^0.1.1": "integrity" "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=" "resolved" "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz" "version" "0.1.2" dependencies: "define-property" "^0.2.5" "object-copy" "^0.1.0" "strict-uri-encode@^1.0.0": "integrity" "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" "resolved" "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz" "version" "1.1.0" "strict-uri-encode@^2.0.0": "integrity" "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" "resolved" "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-2.0.0.tgz" "version" "2.0.0" "string_decoder@^1.1.1": "integrity" "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=" "resolved" "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz" "version" "1.3.0" dependencies: "safe-buffer" "~5.2.0" "string_decoder@~1.1.1": "integrity" "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=" "resolved" "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz" "version" "1.1.1" dependencies: "safe-buffer" "~5.1.0" "string-width@^4.2.3": "integrity" "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=" "resolved" "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz" "version" "4.2.3" dependencies: "emoji-regex" "^8.0.0" "is-fullwidth-code-point" "^3.0.0" "strip-ansi" "^6.0.1" "string.prototype.trimend@^1.0.4": "integrity" "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=" "resolved" "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz" "version" "1.0.4" dependencies: "call-bind" "^1.0.2" "define-properties" "^1.1.3" "string.prototype.trimstart@^1.0.4": "integrity" "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=" "resolved" "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127357785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz" "version" "1.0.4" dependencies: "call-bind" "^1.0.2" "define-properties" "^1.1.3" "strip-ansi@^3.0.0": "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" "resolved" "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz" "version" "3.0.1" dependencies: "ansi-regex" "^2.0.0" "strip-ansi@^6.0.0", "strip-ansi@^6.0.1": "integrity" "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=" "resolved" "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz" "version" "6.0.1" dependencies: "ansi-regex" "^5.0.1" "strip-bom@^3.0.0": "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" "resolved" "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz?cache=0&sync_timestamp=1618599587805&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-3.0.0.tgz" "version" "3.0.0" "strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1": "integrity" "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=" "resolved" "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz" "version" "3.1.1" "supports-color@^2.0.0": "integrity" "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-2.0.0.tgz" "version" "2.0.0" "supports-color@^3.2.3": "integrity" "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=" "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-3.2.3.tgz" "version" "3.2.3" dependencies: "has-flag" "^1.0.0" "supports-color@^5.3.0": "integrity" "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=" "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz" "version" "5.5.0" dependencies: "has-flag" "^3.0.0" "supports-color@^7.1.0": "integrity" "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=" "resolved" "https://registry.npmmirror.com/supports-color/download/supports-color-7.2.0.tgz" "version" "7.2.0" dependencies: "has-flag" "^4.0.0" "supports-preserve-symlinks-flag@^1.0.0": "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" "resolved" "https://registry.npmmirror.com/supports-preserve-symlinks-flag/download/supports-preserve-symlinks-flag-1.0.0.tgz" "version" "1.0.0" "svg-baker@1.7.0": "integrity" "sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=" "resolved" "https://registry.npm.taobao.org/svg-baker/download/svg-baker-1.7.0.tgz" "version" "1.7.0" dependencies: "bluebird" "^3.5.0" "clone" "^2.1.1" "he" "^1.1.1" "image-size" "^0.5.1" "loader-utils" "^1.1.0" "merge-options" "1.0.1" "micromatch" "3.1.0" "postcss" "^5.2.17" "postcss-prefix-selector" "^1.6.0" "posthtml-rename-id" "^1.0" "posthtml-svg-mode" "^1.0.3" "query-string" "^4.3.2" "traverse" "^0.6.6" "svgo@^2.8.0": "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==" "resolved" "https://registry.npmmirror.com/svgo/download/svgo-2.8.0.tgz" "version" "2.8.0" dependencies: "@trysound/sax" "0.2.0" "commander" "^7.2.0" "css-select" "^4.1.3" "css-tree" "^1.1.3" "csso" "^4.2.0" "picocolors" "^1.0.0" "stable" "^0.1.8" "systemjs@^6.11.0": "integrity" "sha512-7YPIY44j+BoY+E6cGBSw0oCU8SNTTIHKZgftcBdwWkDzs/M86Fdlr21FrzAyph7Zo8r3CFGscyFe4rrBtixrBg==" "resolved" "https://registry.npmmirror.com/systemjs/download/systemjs-6.11.0.tgz" "version" "6.11.0" "table@^6.0.9": "integrity" "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==" "resolved" "https://registry.npmmirror.com/table/download/table-6.8.0.tgz" "version" "6.8.0" dependencies: "ajv" "^8.0.1" "lodash.truncate" "^4.4.2" "slice-ansi" "^4.0.0" "string-width" "^4.2.3" "strip-ansi" "^6.0.1" "text-table@^0.2.0": "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" "resolved" "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz" "version" "0.2.0" "to-fast-properties@^2.0.0": "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" "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" "version" "2.0.0" "to-object-path@^0.3.0": "integrity" "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=" "resolved" "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz" "version" "0.3.0" dependencies: "kind-of" "^3.0.2" "to-regex-range@^2.1.0": "integrity" "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=" "resolved" "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz" "version" "2.1.1" dependencies: "is-number" "^3.0.0" "repeat-string" "^1.6.1" "to-regex-range@^5.0.1": "integrity" "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=" "resolved" "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz" "version" "5.0.1" dependencies: "is-number" "^7.0.0" "to-regex@^3.0.1": "integrity" "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=" "resolved" "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz" "version" "3.0.2" dependencies: "define-property" "^2.0.2" "extend-shallow" "^3.0.2" "regex-not" "^1.0.2" "safe-regex" "^1.1.0" "traverse@^0.6.6": "integrity" "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" "resolved" "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz" "version" "0.6.6" "traverse@>=0.3.0 <0.4": "integrity" "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" "resolved" "https://registry.npm.taobao.org/traverse/download/traverse-0.3.9.tgz" "version" "0.3.9" "tsconfig-paths@^3.12.0": "integrity" "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==" "resolved" "https://registry.npmmirror.com/tsconfig-paths/download/tsconfig-paths-3.12.0.tgz" "version" "3.12.0" dependencies: "@types/json5" "^0.0.29" "json5" "^1.0.1" "minimist" "^1.2.0" "strip-bom" "^3.0.0" "tslib@^1.8.1": "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" "resolved" "https://registry.npmmirror.com/tslib/download/tslib-1.14.1.tgz" "version" "1.14.1" "tslib@^2.0.3": "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" "resolved" "https://registry.npmmirror.com/tslib/download/tslib-2.3.1.tgz" "version" "2.3.1" "tsutils@^3.21.0": "integrity" "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=" "resolved" "https://registry.npm.taobao.org/tsutils/download/tsutils-3.21.0.tgz?cache=0&sync_timestamp=1615138184534&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-3.21.0.tgz" "version" "3.21.0" dependencies: "tslib" "^1.8.1" "type-check@^0.4.0", "type-check@~0.4.0": "integrity" "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=" "resolved" "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz" "version" "0.4.0" dependencies: "prelude-ls" "^1.2.1" "type-fest@^0.20.2": "integrity" "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=" "resolved" "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz" "version" "0.20.2" "typescript@^4.5.4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": "integrity" "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==" "resolved" "https://registry.npmmirror.com/typescript/download/typescript-4.5.4.tgz" "version" "4.5.4" "unbox-primitive@^1.0.1": "integrity" "sha1-CF4hViXsMWJXTciFmr7nilmxRHE=" "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" "version" "1.0.1" dependencies: "function-bind" "^1.1.1" "has-bigints" "^1.0.1" "has-symbols" "^1.0.2" "which-boxed-primitive" "^1.0.2" "union-value@^1.0.0": "integrity" "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=" "resolved" "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz" "version" "1.0.1" dependencies: "arr-union" "^3.1.0" "get-value" "^2.0.6" "is-extendable" "^0.1.1" "set-value" "^2.0.1" "universalify@^2.0.0": "integrity" "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc=" "resolved" "https://registry.npm.taobao.org/universalify/download/universalify-2.0.0.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-2.0.0.tgz" "version" "2.0.0" "unset-value@^1.0.0": "integrity" "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=" "resolved" "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz" "version" "1.0.0" dependencies: "has-value" "^0.3.1" "isobject" "^3.0.0" "unzipper@0.10.11": "integrity" "sha1-C0mRRGRyy9uS7nQDkJ8mwkGceC4=" "resolved" "https://registry.npm.taobao.org/unzipper/download/unzipper-0.10.11.tgz" "version" "0.10.11" dependencies: "big-integer" "^1.6.17" "binary" "~0.3.0" "bluebird" "~3.4.1" "buffer-indexof-polyfill" "~1.0.0" "duplexer2" "~0.1.4" "fstream" "^1.0.12" "graceful-fs" "^4.2.2" "listenercount" "~1.0.1" "readable-stream" "~2.3.6" "setimmediate" "~1.0.4" "upper-case-first@^2.0.2": "integrity" "sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=" "resolved" "https://registry.npm.taobao.org/upper-case-first/download/upper-case-first-2.0.2.tgz?cache=0&sync_timestamp=1606867326586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupper-case-first%2Fdownload%2Fupper-case-first-2.0.2.tgz" "version" "2.0.2" dependencies: "tslib" "^2.0.3" "upper-case@^2.0.2": "integrity" "sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=" "resolved" "https://registry.npm.taobao.org/upper-case/download/upper-case-2.0.2.tgz" "version" "2.0.2" dependencies: "tslib" "^2.0.3" "uri-js@^4.2.2": "integrity" "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=" "resolved" "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237624359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz" "version" "4.4.1" dependencies: "punycode" "^2.1.0" "urix@^0.1.0": "integrity" "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" "resolved" "https://registry.npmmirror.com/urix/download/urix-0.1.0.tgz" "version" "0.1.0" "use@^3.1.0": "integrity" "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=" "resolved" "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz" "version" "3.1.1" "util-deprecate@^1.0.1", "util-deprecate@~1.0.1": "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" "resolved" "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz" "version" "1.0.2" "v8-compile-cache@^2.0.3": "integrity" "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=" "resolved" "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz?cache=0&sync_timestamp=1614993994061&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8-compile-cache%2Fdownload%2Fv8-compile-cache-2.3.0.tgz" "version" "2.3.0" "vary@^1": "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" "resolved" "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz" "version" "1.1.2" "vconsole@^3.8.1": "integrity" "sha512-DZ6WrSy+5ep11FWxq89DHv8we83rCCrGZaZqlHEXZ+wCvivFd6kfo8OizIP5iQZ0Ynf8Qxj3UfnilFp4HtTVcA==" "resolved" "https://registry.npmmirror.com/vconsole/download/vconsole-3.11.0.tgz" "version" "3.11.0" dependencies: "cookie-storage" "^6.1.0" "copy-text-to-clipboard" "^3.0.1" "core-js" "^3.11.0" "mutation-observer" "^1.0.3" "vite-plugin-components@^0.13.3": "integrity" "sha1-i9oPUI7pAkmgZrpj1ZhXmOXKn+0=" "resolved" "https://registry.nlark.com/vite-plugin-components/download/vite-plugin-components-0.13.3.tgz" "version" "0.13.3" dependencies: "debug" "^4.3.2" "fast-glob" "^3.2.7" "magic-string" "^0.25.7" "minimatch" "^3.0.4" "vite-plugin-eslint@^1.3.0": "integrity" "sha1-y8PxVCyl6Q1ZLM+2tJV+m2P5mg4=" "resolved" "https://registry.nlark.com/vite-plugin-eslint/download/vite-plugin-eslint-1.3.0.tgz" "version" "1.3.0" dependencies: "@rollup/pluginutils" "^4.1.0" "eslint" "^7.26.0" "rollup" "^2.47.0" "vite-plugin-importer@^0.2.5": "integrity" "sha1-I2PcDZfU7OxTDuQBcTEKF8LbB34=" "resolved" "https://registry.npmmirror.com/vite-plugin-importer/download/vite-plugin-importer-0.2.5.tgz" "version" "0.2.5" dependencies: "@babel/core" "^7.12.17" "@babel/plugin-syntax-import-meta" "^7.10.4" "babel-plugin-import" "^1.13.3" "vite-plugin-optimize-persist@^0.1.2": "integrity" "sha512-H/Ebn2kZO8PvwUF08SsT5K5xMJNCWKoGX71+e9/ER3yNj7GHiFjNQlvGg5ih/zEx09MZ9m7WCxOwmEKbeIVzww==" "resolved" "https://registry.npmmirror.com/vite-plugin-optimize-persist/download/vite-plugin-optimize-persist-0.1.2.tgz" "version" "0.1.2" dependencies: "debug" "^4.3.2" "fs-extra" "^10.0.0" "vite-plugin-package-config@^0.1.0", "vite-plugin-package-config@^0.1.1": "integrity" "sha512-w9B3I8ZnqoyhlbzimXjXNk85imrMZgvI9m8f6j3zonK5IVA5KXzpT+PZOHlDz8lqh1vqvoEI1uhy+ZDoLAiA/w==" "resolved" "https://registry.npmmirror.com/vite-plugin-package-config/download/vite-plugin-package-config-0.1.1.tgz" "version" "0.1.1" dependencies: "debug" "^4.3.3" "vite-plugin-style-import@^1.0.1": "integrity" "sha512-lJCRvm7+So0hHdnSJiJPg9gD5mxtL6YY0jmhEph+k7ArpsyvqOh6han2kG5htbWWDZxHkUN9d1BuTFL//yCLLQ==" "resolved" "https://registry.npmmirror.com/vite-plugin-style-import/download/vite-plugin-style-import-1.4.1.tgz" "version" "1.4.1" dependencies: "@rollup/pluginutils" "^4.1.2" "change-case" "^4.1.2" "debug" "^4.3.3" "es-module-lexer" "^0.9.3" "fs-extra" "^10.0.0" "magic-string" "^0.25.7" "vite-plugin-svg-icons@^1.0.5": "integrity" "sha512-dmpr7Wq8vQN6ajBrVTrBxy8wJjQfcP30i73q+40uAZc8p7EwphBNZ+bVTI0enFaCrsITI8y0Ruo/mN/SaJQ6Hw==" "resolved" "https://registry.npmmirror.com/vite-plugin-svg-icons/download/vite-plugin-svg-icons-1.1.0.tgz" "version" "1.1.0" dependencies: "@types/svgo" "^2.6.0" "cors" "^2.8.5" "debug" "^4.3.3" "etag" "^1.8.1" "fs-extra" "^10.0.0" "svg-baker" "1.7.0" "svgo" "^2.8.0" "vite-plugin-vconsole@^1.1.0": "integrity" "sha512-8oODvR4inPCVbfeWkxmV++sP6qypH7DfxBAzCT3Erm7XnoK8aTuRls30wXlXL6LDB6e090vTELOYyreGe7OOLA==" "resolved" "https://registry.npmmirror.com/vite-plugin-vconsole/download/vite-plugin-vconsole-1.1.1.tgz" "version" "1.1.1" "vite@^2.0.0", "vite@^2.4.0", "vite@^2.5.10", "vite@>=2.0.0": "integrity" "sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w==" "resolved" "https://registry.npmmirror.com/vite/download/vite-2.7.10.tgz" "version" "2.7.10" dependencies: "esbuild" "^0.13.12" "postcss" "^8.4.5" "resolve" "^1.20.0" "rollup" "^2.59.0" optionalDependencies: "fsevents" "~2.3.2" "vue-cookies@^1.7.4": "integrity" "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0=" "resolved" "https://registry.nlark.com/vue-cookies/download/vue-cookies-1.7.4.tgz" "version" "1.7.4" "vue-eslint-parser@^7.10.0": "integrity" "sha1-IUtd6pYQB/z/su5luJEjB2KNDa8=" "resolved" "https://registry.npmmirror.com/vue-eslint-parser/download/vue-eslint-parser-7.11.0.tgz" "version" "7.11.0" dependencies: "debug" "^4.1.1" "eslint-scope" "^5.1.1" "eslint-visitor-keys" "^1.1.0" "espree" "^6.2.1" "esquery" "^1.4.0" "lodash" "^4.17.21" "semver" "^6.3.0" "vue-i18n@^9.1.6": "integrity" "sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==" "resolved" "https://registry.npmmirror.com/vue-i18n/download/vue-i18n-9.1.9.tgz" "version" "9.1.9" dependencies: "@intlify/core-base" "9.1.9" "@intlify/shared" "9.1.9" "@intlify/vue-devtools" "9.1.9" "@vue/devtools-api" "^6.0.0-beta.7" "vue-router@4": "integrity" "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==" "resolved" "https://registry.npmmirror.com/vue-router/download/vue-router-4.0.12.tgz" "version" "4.0.12" dependencies: "@vue/devtools-api" "^6.0.0-beta.18" "vue-tsc@^0.0.24": "integrity" "sha1-DNkNtnn1PqFpQlS4Zj/bPWJKCHI=" "resolved" "https://registry.npmmirror.com/vue-tsc/download/vue-tsc-0.0.24.tgz" "version" "0.0.24" dependencies: "unzipper" "0.10.11" "vue-types@^3.0.0": "integrity" "sha1-7BbgXUEsA4Ji/B76TOuWR+f7YB0=" "resolved" "https://registry.npmmirror.com/vue-types/download/vue-types-3.0.2.tgz" "version" "3.0.2" dependencies: "is-plain-object" "3.0.1" "vue@^3.0.0", "vue@^3.0.2", "vue@^3.2.26", "vue@>=3.0.3", "vue@>=3.1.0", "vue@3.2.26": "integrity" "sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg==" "resolved" "https://registry.npmmirror.com/vue/download/vue-3.2.26.tgz" "version" "3.2.26" dependencies: "@vue/compiler-dom" "3.2.26" "@vue/compiler-sfc" "3.2.26" "@vue/runtime-dom" "3.2.26" "@vue/server-renderer" "3.2.26" "@vue/shared" "3.2.26" "vuex@^4.0.2": "integrity" "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==" "resolved" "https://registry.npmmirror.com/vuex/download/vuex-4.0.2.tgz" "version" "4.0.2" dependencies: "@vue/devtools-api" "^6.0.0-beta.11" "warning@^4.0.0": "integrity" "sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=" "resolved" "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz" "version" "4.0.3" dependencies: "loose-envify" "^1.0.0" "which-boxed-primitive@^1.0.2": "integrity" "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=" "resolved" "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz" "version" "1.0.2" dependencies: "is-bigint" "^1.0.1" "is-boolean-object" "^1.1.0" "is-number-object" "^1.0.4" "is-string" "^1.0.5" "is-symbol" "^1.0.3" "which@^2.0.1": "integrity" "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=" "resolved" "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz" "version" "2.0.2" dependencies: "isexe" "^2.0.0" "word-wrap@^1.2.3": "integrity" "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=" "resolved" "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz?cache=0&sync_timestamp=1589683603678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fword-wrap%2Fdownload%2Fword-wrap-1.2.3.tgz" "version" "1.2.3" "wrappy@1": "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "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" "version" "1.0.2" "yallist@^4.0.0": "integrity" "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" "resolved" "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz" "version" "4.0.0"