commit 051791c538ec3e829f83368cab7c49c80b15bb06 Author: zhujunbei Date: Thu Nov 2 20:12:37 2023 +0800 feat: Initial project diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..bc4414db --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +.DS_Store +node_modules +dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.history \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e69de29b diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..c08e3f54 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# 镜像集成 +FROM ubuntu:latest + +# 安装依赖 +RUN apt-get -y update +RUN apt-get -y install wget gcc + +# 安装node环境 +ENV NODE_VERSION v18.17.1 +RUN mkdir -p /node/$NODE_VERSION +RUN wget https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-linux-x64.tar.gz +RUN tar xzf node-$NODE_VERSION-linux-x64.tar.gz -C /node/ +ENV PATH /node/node-$NODE_VERSION-linux-x64/bin:$PATH + +# 设置工作区间 +WORKDIR /xiaoju-survey + +# 复制文件到工作区间 +COPY . /xiaoju-survey + +RUN npm config set registry https://registry.npmjs.org/ + +# 安装项目依赖 +RUN cd /xiaoju-survey/web && npm install +RUN cd /xiaoju-survey/server && sh init.sh + +# 构建项目,并把产物推送到服务公共目录 +RUN cd /xiaoju-survey/web && npm run build +RUN cd /xiaoju-survey && cp -af ./web/dist/ ./server/src/apps/ui/public/ + +# 暴露端口 +EXPOSE 8080 + +# docker入口文件,运行pm2启动,并保证监听不断 +CMD ["sh","docker-run.sh"] +# 构建镜像 +# docker build -t xiaoju-survey-app . +# 运行容器 +# docker run --rm --name running-xiaoju-survey-app -p 8080:8080 xiaoju-survey-app +# 进入容器 +# docker exec -it running-xiaoju-survey-app bash +# 停止容器 +# docker stop running-xiaoju-survey-app +# 查看日志 +# docker logs running-xiaoju-survey-app \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..fb098f03 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +[](https://xiaojusurvey.didi.cn) + +**XiaoJuSurvey**是一套轻量、安全的问卷系统,提供面向个人和企业的一站式产品级解决方案,快速满足各类线上调研场景。 + +## 简介 +平台在集团内部已沉淀了**40+**种题型,累积精选模板**100+**,适用于市场调研、客户满意度调研、在线考试、投票、报道、测评等众多场景。数据能力上,沉淀了数据表格、分题统计、交叉分析、多渠道分析等在线报表能力,快速满足回收数据专业化线上分析,协助业务挖掘数据价值。 + +本次开源主要围绕问卷生命周期提供了完整的产品化能力: + +- 问卷管理:创、编、投、收、数据分析 + +- 多样化题型:单行输入框、多行输入框、单项选择、多项选择、判断题、评分、投票 + _(更多题型将陆续开放,也欢迎您参与共建提交自定义题型)_ + +- 用户管理:登录、注册、权限管理 + +- 数据安全:传输加密、脱敏等 + + + +_**(个人和企业用户均可快速构建特定领域的调研类解决方案。)**_ + +## 项目优势 +**一、具备全面的综合性和专业性** + +- [制定了问卷标准化协议规范](https://xiaojusurvey.didi.cn/docs/agreement/%E3%80%8A%E9%97%AE%E5%8D%B7Meta%E5%8D%8F%E8%AE%AE%E3%80%8B) + + 领域标准保障概念互通,是全系统的基础和核心。基于实际业务经验,沉淀了两大类: + - 业务描述:问卷协议、题型协议 + - 物料描述:题型物料协议,包含题型和设置器 + +- [制定了问卷UI/UX规范](https://xiaojusurvey.didi.cn/docs/design/%E3%80%8A%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83%E3%80%8B) + + 设计语言是系统灵活性、一致性的基石,保障系统支撑的实际业务运转拥有极高的用户体验。包含两部分: + - 设计规范:灵活、降噪、统一 + - 交互规范:遵循用户行为特征,遵循产品定位,遵循成熟的用户习惯 + +- [所见即所得,搭建渲染一致性高](https://xiaojusurvey.didi.cn/docs/document/%E8%AE%BE%E8%AE%A1%E5%8E%9F%E7%90%86/%E9%A2%98%E5%9E%8B%E5%9C%BA%E6%99%AF%E5%8C%96%E8%AE%BE%E8%AE%A1) + + 实际业务使用上包含问卷生成和投放使用,即对于系统的搭建端和渲染端。我们将题型场景化设计,以满足一份问卷从加工生产到投放应用的高度一致。 + +- [题型物料化设计,自由定制扩展](https://xiaojusurvey.didi.cn/docs/document/%E8%AE%BE%E8%AE%A1%E5%8E%9F%E7%90%86/%E9%A2%98%E5%9E%8B%E7%89%A9%E6%96%99%E5%8C%96%E8%AE%BE%E8%AE%A1/%E5%9F%BA%E7%A1%80%E8%AE%BE%E8%AE%A1) + + 题型是问卷最核心的组成部分,而题型可配置化能力决定了上层业务可扩展的场景以及系统自身可复用的场景。 +题型架构设计上,主打每一类题型拥有通用基础能力,每一种题型拥有原子化特性能力,并保障高度定制化。 + +- [合规建设沉淀积累,安全能力拓展性高](https://xiaojusurvey.didi.cn/docs/document/%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8) + + 数据加密传输、敏感信息精细化检测、投票防刷等能力,保障问卷发布、数据回收链路安全性。 + +**二、轻量化设计,快速接入、灵活扩展** +- [产品级开源方案,快速产出一套调研流程](https://xiaojusurvey.didi.cn/docs/document/%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8C/%E6%A6%82%E8%BF%B0) + + 围绕问卷生命周期提供了完整的产品化能力,包含用户管理: 登录、注册、问卷权限,问卷管理: 创、编、投、收、数据分析,可快速构建特定领域的调研类解决方案。 + +- [问卷设计开箱即用,降低领域复杂度](https://xiaojusurvey.didi.cn/docs/document/%E8%AE%BE%E8%AE%A1%E5%8E%9F%E7%90%86/%E9%97%AE%E5%8D%B7%E6%90%AD%E5%BB%BA%E9%A2%86%E5%9F%9F%E5%8C%96%E8%AE%BE%E8%AE%A1) + + 问卷组成具有高灵活性,此业务特征带来问卷编辑能力的高复杂性设计。我们将问卷编辑划分为五大子领域,进行产品能力聚类,同时指导系统模块化设计和开发。基于模块编排和管理,能够开箱即用。 + +- [二次开发成本低,轻松定制专属调研系统](https://xiaojusurvey.didi.cn/docs/document/%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C/%E5%B7%A5%E7%A8%8B%E9%85%8D%E7%BD%AE%E5%8C%96) + + 全系统设计原则基于协议标准化、功能模块化、管理配置化,并提供了一些列完整的文档和开发及扩展手册。 + +- [部署成本低,快速上线](https://xiaojusurvey.didi.cn/docs/document/%E5%B7%A5%E7%A8%8B%E9%83%A8%E7%BD%B2) + + 前后端分离,提供Docker化方案,提供了完善的部署指导手册。 + +## 快速启动 + +### 复制工程 +```shell +git clone http://github.com/didi/xiaoju-survey +``` + +## 启动 + +### 后端启动 + +#### 安装数据库 +详情查看 [环境准备](https://xiaojusurvey.didi.cn/docs/document/%E6%A6%82%E8%BF%B0/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B#%E5%AE%89%E8%A3%85%E6%95%B0%E6%8D%AE%E5%BA%93) + +#### 安装依赖 +```shell +cd server +sh init.sh +``` + +#### 启动 +```shell +npm run dev +``` + +### 前端启动 +#### 安装依赖 +```shell +cd web +npm install +``` +#### 启动 +```shell +npm run serve +``` + +## 访问 +### 问卷管理端 + +[http://localhost:8080/management](http://localhost:8080) + +### 问卷投放端 +创建并发布问卷: + +[http://localhost:8080/render/:surveyPath](http://localhost:8080/render/:surveyPath) + +## 交流群 +[](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=P61UJI_q8AzizyBLGOm-bUvzNrUnSQq-&authKey=yZFtL9biGB5yiIME3%2Bi%2Bf6XMOdTNiuf0pCIaviEEAIryySNzVy6LJ4xl7uHdEcrM&noverify=0&group_code=920623419) \ No newline at end of file diff --git a/docker-run.sh b/docker-run.sh new file mode 100644 index 00000000..53f1f058 --- /dev/null +++ b/docker-run.sh @@ -0,0 +1,3 @@ +#! /bin/bash +cd /xiaoju-survey/server +npm run start \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 00000000..bd8a245e --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,106 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ +package-lock.json + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# project +build/ +src/apps/question/config/env/local.ts diff --git a/server/README.md b/server/README.md new file mode 100644 index 00000000..c2f722ed --- /dev/null +++ b/server/README.md @@ -0,0 +1,18 @@ +# 问卷引擎服务端 +问卷引擎服务端主要用于提供问卷的的管理端和发布端接口,其中管理端包括但不限于创建,编辑,修改,发布问卷接口。发布端主要为问卷提交接口和问卷信息获取接口,再通过问卷的渲染服务来渲染前端内容。 + +# 项目依赖安装 +进入服务端目录,运行init.sh来进行依赖安装 +```sh +sh init.sh +``` +# 项目的启动 +开发模式的启动 +``` +npm run dev +``` +正式环境的启动 +``` +npm run start +``` +服务默认启动端口为8080 diff --git a/server/init.sh b/server/init.sh new file mode 100644 index 00000000..8b311bf5 --- /dev/null +++ b/server/init.sh @@ -0,0 +1,10 @@ +#!/bin/bash +npm install +for appDir in `ls src/apps` +do + cd src/apps/$appDir + # 进行安装依赖 + npm install + cd ../../../ +done +cd .. diff --git a/server/package.json b/server/package.json new file mode 100644 index 00000000..674025b1 --- /dev/null +++ b/server/package.json @@ -0,0 +1,34 @@ +{ + "name": "survey-template", + "version": "1.0.0", + "description": "survey server template", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "copy": "cp -rf ./src/ ./build/", + "build": "tsc", + "launch": "npm run build && SERVER_ENV=local node ./build/index.js", + "start:stable": "SERVER_ENV=stable node ./build/index.js", + "start:preonline": "SERVER_ENV=preonline node ./build/index.js", + "start:online": "SERVER_ENV=online node ./build/index.js", + "start": "npm run copy && npm run launch", + "dev": "npm run copy && nodemon -e js,mjs,json,ts --exec 'npm run launch' --watch ./src" + }, + "devDependencies": { + "nodemon": "^2.0.20", + "typescript": "^4.8.4" + }, + "dependencies": { + "@types/koa": "^2.13.8", + "@types/koa-bodyparser": "^4.3.10", + "@types/koa-router": "^7.4.4", + "koa": "^2.14.2", + "koa-bodyparser": "^4.4.1", + "koa-pino-logger": "^4.0.0", + "koa-router": "^12.0.0" + }, + "engines": { + "node": ">=14.15.4", + "npm": ">=6.14.10" + } +} diff --git a/server/src/apps/security/config/index.ts b/server/src/apps/security/config/index.ts new file mode 100644 index 00000000..80fc5f03 --- /dev/null +++ b/server/src/apps/security/config/index.ts @@ -0,0 +1,10 @@ +const config = { + mongo: { + url: process.env.xiaojuSurveyMongoUrl || 'mongodb://localhost:27017', + dbName: 'xiaojuSurvey' + } +} + +export function getConfig() { + return config +} \ No newline at end of file diff --git a/server/src/apps/security/db/mongo.ts b/server/src/apps/security/db/mongo.ts new file mode 100644 index 00000000..6aab7c5f --- /dev/null +++ b/server/src/apps/security/db/mongo.ts @@ -0,0 +1,33 @@ +import { Collection, MongoClient, ObjectId } from 'mongodb' +import { getConfig } from '../config/index' + +const config = getConfig() + +class mongoService { + isInit: boolean + client: MongoClient + constructor() { + this.client = new MongoClient(config.mongo.url); + } + async getCollection({ collectionName }): Promise { + await this.client.connect() + return this.client.db(config.mongo.dbName).collection(collectionName) + } + + convertId2StringByDoc(doc: any): any { + doc._id = doc._id.toString() + return doc; + } + + convertId2StringByList(list: Array): Array { + return list.map(e => { + return this.convertId2StringByDoc(e); + }) + } + + getObjectIdByStr(str: string): ObjectId { + return new ObjectId(str) + } +} + +export const mongo = new mongoService() \ No newline at end of file diff --git a/server/src/apps/security/index.ts b/server/src/apps/security/index.ts new file mode 100644 index 00000000..0247ad51 --- /dev/null +++ b/server/src/apps/security/index.ts @@ -0,0 +1,16 @@ +import { SurveyServer } from '../../decorator' +import { securityService } from './service/securityService' + +export default class Security { + @SurveyServer({ type: 'rpc' }) + async isHitKeys({ params, context }: { params: any, context: any }) { + const data = securityService.isHitKeys({ + content: params.content, + dictType: params.dictType, + }) + return { + result: data, + context, // 上下文主要是传递调用方信息使用,比如traceid + } + } +} \ No newline at end of file diff --git a/server/src/apps/security/package.json b/server/src/apps/security/package.json new file mode 100644 index 00000000..5c559fee --- /dev/null +++ b/server/src/apps/security/package.json @@ -0,0 +1,10 @@ +{ + "name": "sceurity", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "mongodb": "^5.7.0" + }, + "devDependencies": {} +} diff --git a/server/src/apps/security/service/securityService.ts b/server/src/apps/security/service/securityService.ts new file mode 100644 index 00000000..9ff6bfd6 --- /dev/null +++ b/server/src/apps/security/service/securityService.ts @@ -0,0 +1,14 @@ +import { mongo } from '../db/mongo' +import { DICT_TYPE } from '../types/index' +import { participle } from '../utils/index' + +class SecurityService { + async isHitKeys({ content, dictType }: { content: string, dictType: DICT_TYPE }) { + const securityDictModel = await mongo.getCollection({ collectionName: 'securityDict' }); + const keywordList = participle({ content }) + const hitCount = await securityDictModel.countDocuments({ keyword: { $in: keywordList }, type: dictType }) + return hitCount > 0 + } +} + +export const securityService = new SecurityService() \ No newline at end of file diff --git a/server/src/apps/security/types/index.ts b/server/src/apps/security/types/index.ts new file mode 100644 index 00000000..efd5d2f8 --- /dev/null +++ b/server/src/apps/security/types/index.ts @@ -0,0 +1,14 @@ +export enum DICT_TYPE { + danger = "danger", + secret = "secret", +} + +export class CommonError extends Error { + code: number + errmsg: number + constructor(msg, code = 500) { + super(msg) + this.errmsg = msg; + this.code = code; + } +} diff --git a/server/src/apps/security/utils/index.ts b/server/src/apps/security/utils/index.ts new file mode 100644 index 00000000..7e22f44a --- /dev/null +++ b/server/src/apps/security/utils/index.ts @@ -0,0 +1,17 @@ +import { CommonError } from '../types/index' + +export function participle({ content, minLen, maxLen }: { content: string, minLen?: number, maxLen?: number }) { + const keys: Array = [] + minLen = minLen || 2 + maxLen = maxLen || 13 + for (let i = 0; i < content.length; i++) { + let tempStr = content[i] + for (let j = 1; j < maxLen && i + j < content.length; j++) { + tempStr += content[i + j] + if (j >= minLen - 1) { + keys.push(tempStr) + } + } + } + return keys +} \ No newline at end of file diff --git a/server/src/apps/surveyManage/config/index.ts b/server/src/apps/surveyManage/config/index.ts new file mode 100644 index 00000000..a4b2372b --- /dev/null +++ b/server/src/apps/surveyManage/config/index.ts @@ -0,0 +1,10 @@ +const config = { + mongo: { + url: process.env.xiaojuSurveyMongoUrl || 'mongodb://localhost:27017', + dbName: 'surveyEengine' + } +} + +export function getConfig() { + return config +} \ No newline at end of file diff --git a/server/src/apps/surveyManage/db/mongo.ts b/server/src/apps/surveyManage/db/mongo.ts new file mode 100644 index 00000000..6aab7c5f --- /dev/null +++ b/server/src/apps/surveyManage/db/mongo.ts @@ -0,0 +1,33 @@ +import { Collection, MongoClient, ObjectId } from 'mongodb' +import { getConfig } from '../config/index' + +const config = getConfig() + +class mongoService { + isInit: boolean + client: MongoClient + constructor() { + this.client = new MongoClient(config.mongo.url); + } + async getCollection({ collectionName }): Promise { + await this.client.connect() + return this.client.db(config.mongo.dbName).collection(collectionName) + } + + convertId2StringByDoc(doc: any): any { + doc._id = doc._id.toString() + return doc; + } + + convertId2StringByList(list: Array): Array { + return list.map(e => { + return this.convertId2StringByDoc(e); + }) + } + + getObjectIdByStr(str: string): ObjectId { + return new ObjectId(str) + } +} + +export const mongo = new mongoService() \ No newline at end of file diff --git a/server/src/apps/surveyManage/index.ts b/server/src/apps/surveyManage/index.ts new file mode 100644 index 00000000..b543802a --- /dev/null +++ b/server/src/apps/surveyManage/index.ts @@ -0,0 +1,184 @@ +import { SurveyServer } from '../../decorator' +import { Request, Response } from 'koa' +import { surveyService } from './service/surveyService' +import { userService } from './service/userService' +import { surveyHistoryService } from './service/surveyHistoryService' +import { HISTORY_TYPE } from './types/index' +import { getValidateValue } from './utils/index' +import * as Joi from 'joi' + +export default class SurveyManage { + @SurveyServer({type:'http',method:'get',routerName:'/getBannerData'}) + async getBannerData({req,res}:{req:Request, res:Response}) { + const data = await surveyService.getBannerData() + return { + code:200, + data, + } + } + + @SurveyServer({type:'http',method:'post',routerName:'/add'}) + async add({req,res}:{req:Request, res:Response}) { + const params = getValidateValue(Joi.object({ + remark: Joi.string().required(), + questionType: Joi.string().required(), + title: Joi.string().required(), + }).validate(req.body,{allowUnknown: true})); + params.userData = await userService.checkLogin({req}) + const addRes = await surveyService.add(params) + return { + code:200, + data: { + id: addRes.pageId, + }, + } + } + + @SurveyServer({type:'http',method:'post',routerName:'/update'}) + async update({req,res}:{req:Request, res:Response}) { + const surveyParams = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + remark: Joi.string().required(), + title: Joi.string().required(), + }).validate(req.body,{allowUnknown: true})); + const userData = await userService.checkLogin({req}) + surveyParams.userData = userData + const data = await surveyService.update(surveyParams) + return { + code:200, + data, + } + } + + @SurveyServer({type:'http',method:'post',routerName:'/delete'}) + async delete({req,res}:{req:Request, res:Response}) { + const surveyParams = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + }).validate(req.body,{allowUnknown: true})); + const userData = await userService.checkLogin({req}) + surveyParams.userData = userData + const data = await surveyService.delete(surveyParams) + return { + code:200, + data, + } + } + @SurveyServer({type:'http',method:'get',routerName:'/list'}) + async list({req,res}:{req:Request, res:Response}) { + const condition = getValidateValue(Joi.object({ + curPage: Joi.number().default(1), + pageSize: Joi.number().default(10), + }).validate(req.query,{allowUnknown: true})); + const userData = await userService.checkLogin({req}) + const listRes = await surveyService.list({ + pageNum:condition.curPage, + pageSize:condition.pageSize, + userData + }) + return { + code:200, + data: listRes, + } + } + @SurveyServer({type:'http',method:'post',routerName:'/saveConf'}) + async saveConf({req,res}:{req:Request, res:Response}) { + const surveyData = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + configData: Joi.object().required(), + }).validate(req.body,{allowUnknown: true})); + const userData = await userService.checkLogin({req}) + // 保存数据 + const saveRes = await surveyService.saveConf(surveyData); + // 保存历史 + const historyRes = await surveyHistoryService.addHistory({ + surveyId:surveyData.surveyId, + configData:surveyData.configData, + type:HISTORY_TYPE.dailyHis, + userData + }); + return { + code:200, + data:{ + saveRes, + historyRes + } + } + } + + @SurveyServer({type:'http',method:'get',routerName:'/get'}) + async get({req,res}:{req:Request, res:Response}) { + const params = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + }).validate(req.query,{allowUnknown: true})); + const userData = await userService.checkLogin({req}) + const data = await surveyService.get({ + surveyId:params.surveyId, + userData + }) + return { + code:200, + data, + } + } + + @SurveyServer({type:'http',method:'get',routerName:'/getHistoryList'}) + async getHistoryList({req,res}:{req:Request, res:Response}) { + const historyParams = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + historyType: Joi.string().required(), + }).validate(req.query,{allowUnknown: true})); + const data = await surveyHistoryService.getHistoryList(historyParams) + return { + code:200, + data + } + } + + @SurveyServer({type:'http',method:'post',routerName:'/publish'}) + async publish({req,res}:{req:Request, res:Response}) { + const surveyParams = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + }).validate(req.body,{allowUnknown: true})); + // 鉴权 + const userData = await userService.checkLogin({req}) + // 发布 + surveyParams.userData = userData + const surveyData = await surveyService.publish(surveyParams) + // 保存历史 + const historyRes = await surveyHistoryService.addHistory({ + surveyId:surveyData.surveyConfRes.pageId, + configData:surveyData.surveyConfRes.code, + type:HISTORY_TYPE.publishHis, + userData + }); + return { + code:200, + data:{ + ...surveyData, + historyRes + } + } + } + + @SurveyServer({type:'http',method:'get',routerName:'/data'}) + async data({req,res}:{req:Request, res:Response}) { + const surveyParams = getValidateValue(Joi.object({ + surveyId: Joi.string().required(), + isShowSecret:Joi.boolean().default(true), // 默认true就是需要脱敏 + page: Joi.number().default(1), + pageSize: Joi.number().default(10), + }).validate(req.query,{allowUnknown: true})); + const userData = await userService.checkLogin({req}) + const data = await surveyService.data({ + userData, + surveyId:surveyParams.surveyId, + isShowSecret:surveyParams.isShowSecret, + pageNum:surveyParams.page, + pageSize:surveyParams.pageSize, + }) + return { + code:200, + data + } + } +} \ No newline at end of file diff --git a/server/src/apps/surveyManage/package.json b/server/src/apps/surveyManage/package.json new file mode 100644 index 00000000..0b482bbb --- /dev/null +++ b/server/src/apps/surveyManage/package.json @@ -0,0 +1,13 @@ +{ + "name": "survey_manage", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "joi": "^17.9.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "mongodb": "^5.7.0" + }, + "devDependencies": {} +} diff --git a/server/src/apps/surveyManage/service/surveyHistoryService.ts b/server/src/apps/surveyManage/service/surveyHistoryService.ts new file mode 100644 index 00000000..b1a81ea6 --- /dev/null +++ b/server/src/apps/surveyManage/service/surveyHistoryService.ts @@ -0,0 +1,37 @@ +import { mongo } from '../db/mongo' +import { getStatusObject } from '../utils/index' +import { SURVEY_STATUS, HISTORY_TYPE, UserType } from '../types/index' + +class SurveyHistoryService { + async addHistory(surveyData: { surveyId: string, configData: any, type: HISTORY_TYPE, userData: UserType }) { + const surveyHistory = await mongo.getCollection({ collectionName: 'surveyHistory' }); + const surveyHistoryRes = await surveyHistory.insertOne({ + curStatus: getStatusObject({ status: SURVEY_STATUS.new }), + pageId: surveyData.surveyId, + type: surveyData.type, + code: { + data: surveyData.configData + }, + createDate: Date.now(), + operator: { + _id: surveyData.userData._id, + username: surveyData.userData.username, + } + }) + return surveyHistoryRes + } + + async getHistoryList(historyParams: { surveyId: string, historyType: HISTORY_TYPE }) { + const surveyHistory = await mongo.getCollection({ collectionName: 'surveyHistory' }); + const surveyHistoryListRes = await surveyHistory.find({ + pageId: historyParams.surveyId, + type: historyParams.historyType, + }) + .sort({ createDate: -1 }) + .limit(100) + .toArray() + return mongo.convertId2StringByList(surveyHistoryListRes) + } +} + +export const surveyHistoryService = new SurveyHistoryService() \ No newline at end of file diff --git a/server/src/apps/surveyManage/service/surveyService.ts b/server/src/apps/surveyManage/service/surveyService.ts new file mode 100644 index 00000000..b26b0b1f --- /dev/null +++ b/server/src/apps/surveyManage/service/surveyService.ts @@ -0,0 +1,307 @@ +import { mongo } from '../db/mongo' +import { rpcInvote } from '../../../rpc' +import { SURVEY_STATUS, QUESTION_TYPE, CommonError, UserType, DICT_TYPE } from '../types/index' +import { getStatusObject, genSurveyPath, getMapByKey, hanleSensitiveDate } from '../utils/index' +import * as path from "path"; +import * as _ from "lodash"; +import * as moment from "moment"; + +class SurveyService { + async checkSecurity({ content, dictType }: { content: string, dictType: DICT_TYPE }) { + const rpcResult = await rpcInvote('security.isHitKeys', { + params: { content, dictType }, + context: {} + }) + return rpcResult.result + } + + async getBannerData() { + const bannerConfPath = path.resolve(__dirname, "../template/banner/index.json"); + return require(bannerConfPath) + } + + async getCodeData({ + questionType, + }: { questionType: QUESTION_TYPE }): Promise { + const baseConfPath = path.resolve(__dirname, "../template/surveyTemplate/templateBase.json"); + const templateConfPath = path.resolve( + __dirname, + `../template/surveyTemplate/survey/${questionType}.json`, + ); + const baseConf = _.cloneDeep(require(baseConfPath)) + const templateConf = _.cloneDeep(require(templateConfPath)) + const codeData = _.merge(baseConf, templateConf); + const nowMoment = moment() + codeData.baseConf.begTime = nowMoment.format("YYYY-MM-DD HH:mm:ss") + codeData.baseConf.endTime = nowMoment.add(10, 'years').format("YYYY-MM-DD HH:mm:ss") + return codeData; + } + async getNewSurveyPath() { + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const surveyPath = genSurveyPath() + const surveyPathCount = await surveyMeta.countDocuments({ surveyPath }) + if (surveyPathCount > 0) { return await this.getNewSurveyPath() } + return surveyPath + } + + async add(surveyMetaInfo: { remark: string, questionType: QUESTION_TYPE, title: string, userData: UserType }) { + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const now = Date.now() + const surveyPath = await this.getNewSurveyPath() + const surveyMetaRes = await surveyMeta.insertOne({ + surveyPath, + remark: surveyMetaInfo.remark, + questionType: surveyMetaInfo.questionType, + title: surveyMetaInfo.title, + creator: surveyMetaInfo.userData.username, + owner: surveyMetaInfo.userData.username, + curStatus: getStatusObject({ status: SURVEY_STATUS.new }), + createDate: now, + updateDate: now, + }) + const pageId = surveyMetaRes.insertedId.toString() + const surveyConf = await mongo.getCollection({ collectionName: 'surveyConf' }); + const surveyConfRes = await surveyConf.insertOne({ + pageId, + pageType: surveyMetaInfo.questionType, + curStatus: getStatusObject({ status: SURVEY_STATUS.new }), + code: await this.getCodeData({ + questionType: surveyMetaInfo.questionType, + }) + }) + return { + pageId, + surveyMetaRes, + surveyConfRes + } + } + + async update(surveyParams: { surveyId: string, remark: string, title: string, userData: UserType }) { + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const _id = mongo.getObjectIdByStr(surveyParams.surveyId) + const surveyMetaUpdateRes = await surveyMeta.updateOne({ + _id, + owner: surveyParams.userData.username, + }, { + $set: { + remark: surveyParams.remark, + title: surveyParams.title, + updateDate: Date.now(), + } + }) + if (surveyMetaUpdateRes.matchedCount < 1) { + throw new CommonError("更新问卷信息失败,问卷不存在或您不是该问卷所有者") + } + return { + surveyMetaUpdateRes + } + } + + async delete(surveyParams: { surveyId: string, userData: UserType }) { + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const _id = mongo.getObjectIdByStr(surveyParams.surveyId) + const surveyMetaDeleteRes = await surveyMeta.deleteOne({ + _id, + owner: surveyParams.userData.username, + }) + if (surveyMetaDeleteRes.deletedCount < 1) { + throw new CommonError("删除问卷失败,问卷已被删除或您不是该问卷所有者") + } + return { + surveyMetaDeleteRes + } + } + + async list(condition: { pageNum: number, pageSize: number, userData: UserType }) { + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const cond = { + owner: condition.userData.username + } + const data = await surveyMeta.find(cond) + .sort({ updateDate: -1 }) + .limit(condition.pageSize) + .skip((condition.pageNum - 1) * condition.pageSize) + .toArray() + const count = await surveyMeta.countDocuments(cond); + return { data: mongo.convertId2StringByList(data), count } + } + + getListHeadByDataList(dataList) { + return dataList.map(surveyItem => { + let othersCode; + if(surveyItem.type === 'radio-star') { + const rangeConfigKeys = Object.keys(surveyItem.rangeConfig) + if(rangeConfigKeys.length>0) { + othersCode = [{code: `${surveyItem.field}_custom`, option: "填写理由"}] + } + } else { + othersCode = (surveyItem.options || []) + .filter(optionItem => optionItem.othersKey) + .map((optionItem) => { + return { + code: optionItem.othersKey, + option: optionItem.text + } + }) + } + return { + field: surveyItem.field, + title: surveyItem.title, + type: surveyItem.type, + othersCode + } + }) + } + + async data(condition: { userData:UserType,surveyId: string, pageNum: number, pageSize: number, isShowSecret: boolean }) { + const surveyObjectId = mongo.getObjectIdByStr(condition.surveyId) + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const surveyMetaData = await surveyMeta.findOne({ _id: surveyObjectId }) + if (surveyMetaData.owner !== condition.userData.username) { + throw new CommonError("问卷回收数据列表仅所有人才能打开") + } + const surveyPublish = await mongo.getCollection({ collectionName: 'surveyPublish' }); + const publishConf = await surveyPublish.findOne({ pageId: condition.surveyId }) + const dataList = publishConf?.code?.dataConf?.dataList || [] + const listHead = this.getListHeadByDataList(dataList) + const dataListMap = getMapByKey({ data: dataList, key: 'field' }) + const surveySubmit = await mongo.getCollection({ collectionName: 'surveySubmit' }); + const surveySubmitData = await surveySubmit.find({ pageId: condition.surveyId }) + .sort({ createDate: -1 }) + .limit(condition.pageSize) + .skip((condition.pageNum - 1) * condition.pageSize) + .toArray() + const listBody = surveySubmitData.map((surveySubmitResList) => { + const data = surveySubmitResList.data + const dataKeys = Object.keys(data) + for(const itemKey of dataKeys) { + if(typeof itemKey !== 'string') {continue} + if(itemKey.indexOf("data")!==0) {continue} + const itemConfigKey = itemKey.split("_")[0]; + const itemConfig = dataListMap[itemConfigKey]; + // 题目删除会出现,数据列表报错 + if(!itemConfig) {continue} + const doSecretData = (data)=>{ + if(itemConfig.isSecret && condition.isShowSecret) { + return hanleSensitiveDate(data) + } else { + return data; + } + } + data[itemKey] = doSecretData(data[itemKey]) + // 处理选项 + if(itemConfig.type === 'radio-star' && !data[`${itemConfigKey}_custom`]) { + data[`${itemConfigKey}_custom`] = data[`${itemConfigKey}_${data[itemConfigKey]}`] + } + if (!itemConfig?.options?.length) { continue } + const options = itemConfig.options + const optionsMap = getMapByKey({ data: options, key: 'hash' }) + const getText = e => doSecretData(optionsMap?.[e]?.text || e); + if (Array.isArray(data[itemKey])) { + data[itemKey] = data[itemKey].map(getText) + } else { + data[itemKey] = getText(data[itemKey]) + } + } + return data + }) + const total = await surveySubmit.countDocuments({ pageId: condition.surveyId }); + return { + total, + listHead, + listBody + } + } + + + async get({ surveyId, userData }: { surveyId: string, userData: UserType }) { + const surveyObjectId = mongo.getObjectIdByStr(surveyId) + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const surveyMetaData = await surveyMeta.findOne({ _id: surveyObjectId }) + if (!surveyMetaData) { + throw new CommonError("问卷不存在或已被删除") + } + if (surveyMetaData.owner !== userData.username) { + throw new CommonError("问卷仅所有人才能打开") + } + const surveyMetaRes = mongo.convertId2StringByDoc(surveyMetaData) + const surveyConf = await mongo.getCollection({ collectionName: 'surveyConf' }); + const surveyConfData = await surveyConf.findOne({ pageId: surveyId }) + if (!surveyConfData) { + throw new CommonError("问卷配置不存在或已被删除") + } + const surveyConfRes = mongo.convertId2StringByDoc(surveyConfData) + return { + surveyMetaRes, + surveyConfRes + } + } + + + async saveConf(surveyData: { surveyId: string, configData: any }) { + const surveyConf = await mongo.getCollection({ collectionName: 'surveyConf' }); + const saveRes = await surveyConf.updateOne({ + pageId: surveyData.surveyId + }, { + $set: { + code: surveyData.configData + } + }) + return saveRes + } + + async publish({ surveyId, userData }: { surveyId: string, userData: UserType }) { + const surveyObjectId = mongo.getObjectIdByStr(surveyId) + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const surveyConf = await mongo.getCollection({ collectionName: 'surveyConf' }); + const surveyMetaRes = await surveyMeta.findOne({ _id: surveyObjectId }) + if (!surveyMetaRes) { + throw new CommonError("问卷不存在或已被删除,无法发布") + } + if (surveyMetaRes.owner !== userData.username) { + throw new CommonError("只有问卷的所有者才能发布该问卷") + } + const surveyConfRes = await surveyConf.findOne({ pageId: surveyId }) + if (!surveyConfRes) { + throw new CommonError("问卷配置不存在或已被删除,无法发布") + } + const surveyPublish = await mongo.getCollection({ collectionName: 'surveyPublish' }); + // 清除id存储发布 + delete surveyConfRes._id; + surveyConfRes.title = surveyMetaRes.title + surveyConfRes.curStatus = surveyMetaRes.curStatus + surveyConfRes.surveyPath = surveyMetaRes.surveyPath + const dataList = surveyConfRes?.code?.dataConf?.dataList || [] + for (const data of dataList) { + const isDangerKey = await this.checkSecurity({ content: data.title, dictType: DICT_TYPE.danger }) + if (isDangerKey) { + throw new CommonError("问卷存在非法关键字,不允许发布") + } + const isSecretKey = await this.checkSecurity({ content: data.title, dictType: DICT_TYPE.secret }) + if (isSecretKey) { + data.isSecret = true + } + } + const publishRes = await surveyPublish.updateOne({ + pageId: surveyId + }, { + $set: surveyConfRes + }, { + upsert: true //如果不存在则插入 + }); + const updateMetaRes = await surveyMeta.updateOne({ + _id: surveyObjectId + }, { + $set: { + curStatus: getStatusObject({ status: SURVEY_STATUS.published }), + } + }) + return { + updateMetaRes, + surveyConfRes, + publishRes + } + } +} + +export const surveyService = new SurveyService() \ No newline at end of file diff --git a/server/src/apps/surveyManage/service/userService.ts b/server/src/apps/surveyManage/service/userService.ts new file mode 100644 index 00000000..f2d3bea8 --- /dev/null +++ b/server/src/apps/surveyManage/service/userService.ts @@ -0,0 +1,19 @@ +import { rpcInvote } from '../../../rpc' +import { Request } from 'koa' +import { UserType, CommonError } from '../types/index' + +class UserService { + async checkLogin({ req }: { req: Request }) { + if (!req.headers['authorization']) { + throw new CommonError('请先登录', 403) + } + const token = (String(req.headers['authorization']) || '').replace("Bearer ", "") + const rpcResult = await rpcInvote('user.getUserByToken', { + params: { token }, + context: req + }) + return rpcResult.result + } +} + +export const userService = new UserService() \ No newline at end of file diff --git a/server/src/apps/surveyManage/template/banner/index.json b/server/src/apps/surveyManage/template/banner/index.json new file mode 100644 index 00000000..900feeef --- /dev/null +++ b/server/src/apps/surveyManage/template/banner/index.json @@ -0,0 +1,174 @@ +{ + "temp": { + "key": "default", + "name": "默认分类", + "list": [{ + "src": "/imgs/skin/17e06b7604a007e1d3e1453b9ddadc3c.jpg", + "title": "1" + }] +}, + "activity": { + "key": "activity", + "name": "节日", + "list": [{ + "src": "/imgs/skin/Ixx8hqiwwk1660979120801.jpg", + "title": "1" + }] + }, + "creative": { + "key": "creative", + "name": "创意", + "list": [{ + "src": "/imgs/skin/PLwNH1rAie1558430219772.jpg", + "title": "1" + }, { + "src": "/imgs/skin/NnXsAOhBNm1558430219312.jpg", + "title": "2" + }, { + "src": "/imgs/skin/ujpUoWqhw31558430220124.jpg", + "title": "3" + }, { + "src": "/imgs/skin/5OCvbjqJQm1558430220362.jpg", + "title": "4" + }, { + "src": "/imgs/skin/0k7Jg7In8I1558430221154.jpg", + "title": "5" + }, { + "src": "/imgs/skin/UH0A8DbTai1558430221033.jpg", + "title": "6" + }, { + "src": "/imgs/skin/FRIzPC6ZtN1558430221344.jpg", + "title": "7" + }] + }, + "scenery": { + "key": "scenery", + "name": "风景", + "list": [{ + "src": "/imgs/skin/SyiLRcukyE1558430525760.jpg", + "title": "1" + }, { + "src": "/imgs/skin/sqYig4AcWr1558430525663.jpg", + "title": "2" + }, { + "src": "/imgs/skin/ElNeqJT2I21558430526165.jpg", + "title": "3" + }, { + "src": "/imgs/skin/CxQkSU6AY21558430526163.jpg", + "title": "4" + }, { + "src": "/imgs/skin/VTUwbp6vY61558430527320.jpg", + "title": "5" + }, { + "src": "/imgs/skin/SHs0K703Yn1558430527218.jpg", + "title": "6" + }, { + "src": "/imgs/skin/oVTedX9V4s1558430527671.jpg", + "title": "7" + }] + }, + "transportation": { + "key": "transportation", + "name": "交通", + "list": [{ + "src": "/imgs/skin/XYKqJZuMig1558430904735.jpg", + "title": "1" + }, { + "src": "/imgs/skin/GnPatsr48Z1558430904680.jpg", + "title": "2" + }, { + "src": "/imgs/skin/UqIvVvEXAK1558430905204.jpg", + "title": "3" + }, { + "src": "/imgs/skin/PUssufh5uI1558430905104.jpg", + "title": "4" + }, { + "src": "/imgs/skin/O409pRTDlW1558430905738.jpg", + "title": "5" + }, { + "src": "/imgs/skin/A9FzlbYXqI1558430905739.jpg", + "title": "6" + }, { + "src": "/imgs/skin/HN9YGctDeF1558430906686.jpg", + "title": "7" + }] + }, + "delicacy": { + "key": "delicacy", + "name": "美食", + "list": [{ + "src": "/imgs/skin/lE6PSclCcU1558434536703.jpg", + "title": "1" + }, { + "src": "/imgs/skin/OnSdbm7u6n1558434536641.jpg", + "title": "2" + }, { + "src": "/imgs/skin/N9Z2ZuyO731558434537314.jpg", + "title": "3" + }, { + "src": "/imgs/skin/YP9PoW8pX51558434537301.jpg", + "title": "4" + }, { + "src": "/imgs/skin/zUtDv378bg1558434538351.jpg", + "title": "5" + }, { + "src": "/imgs/skin/gY1JljCow21558434538303.jpg", + "title": "6" + }, { + "src": "/imgs/skin/oOjHPbABdd1558434538864.jpg", + "title": "7" + }] + }, + "business": { + "key": "business", + "name": "商务", + "list": [{ + "src": "/imgs/skin/3ABKqvDaVn1558514860472.jpg", + "title": "1" + }, { + "src": "/imgs/skin/OewuaQmWoq1558514860285.jpg", + "title": "2" + }, { + "src": "/imgs/skin/HuVqqtbFjs1558514860570.jpg", + "title": "3" + }, { + "src": "/imgs/skin/icSlqsr0uZ1558514860875.jpg", + "title": "4" + }, { + "src": "/imgs/skin/Qu9rg33wmq1558514861015.jpg", + "title": "5" + }, { + "src": "/imgs/skin/145gBCRtNP1558514861211.jpg", + "title": "6" + }, { + "src": "/imgs/skin/ykWLFV0QWj1558514861444.jpg", + "title": "7" + }] + }, + "campus": { + "key": "campus", + "name": "校园", + "list": [{ + "src": "/imgs/skin/4aWi5JxG471558514268698.jpg", + "title": "1" + }, { + "src": "/imgs/skin/j8C2OBP7WK1558514268563.jpg", + "title": "2" + }, { + "src": "/imgs/skin/q3uJoQhYsR1558514268877.jpg", + "title": "3" + }, { + "src": "/imgs/skin/W5PPlNsmsr1558514269088.jpg", + "title": "4" + }, { + "src": "/imgs/skin/6xQk1IAmKt1558514269874.jpg", + "title": "5" + }, { + "src": "/imgs/skin/XQE2iyF0rj1558514269935.jpg", + "title": "6" + }, { + "src": "/imgs/skin/POHlQiSwPR1558514270379.jpg", + "title": "7" + }] + } +} \ No newline at end of file diff --git a/server/src/apps/surveyManage/template/surveyTemplate/survey/normal.json b/server/src/apps/surveyManage/template/surveyTemplate/survey/normal.json new file mode 100644 index 00000000..8660bdfd --- /dev/null +++ b/server/src/apps/surveyManage/template/surveyTemplate/survey/normal.json @@ -0,0 +1,148 @@ +{ + "bannerConf": { + "titleConfig": { + "mainTitle": "

欢迎填写问卷

为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,期待您的参与!

", + "subTitle": "" + }, + "bannerConfig": { + "bgImage": "//img-hxy021.didistatic.com/static/starimg/img/BP0HXOXDv01698311607854.jpg", + "videoLink": "", + "postImg": "" + } + }, + "dataConf": { + "dataList": [ + { + "isRequired": true, + "showIndex": true, + "showType": true, + "showSpliter": true, + "type": "text", + "valid": "", + "field": "data458", + "title": "标题1", + "placeholder": "", + "randomSort": false, + "checked": false, + "minNum": "", + "maxNum": "", + "maxPhotos": 5, + "star": 5, + "timeStep": { + "hour": 1, + "min": 10 + }, + "nps": { + "leftText": "极不满意", + "rightText": "极满意" + }, + "placeholderDesc": "", + "addressType": 3, + "isAuto": false, + "urlKey": "", + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + }, + { + "isRequired": true, + "showIndex": true, + "showType": true, + "showSpliter": true, + "type": "radio", + "placeholderDesc": "", + "field": "data515", + "title": "标题2", + "placeholder": "", + "randomSort": false, + "checked": false, + "minNum": "", + "maxNum": "", + "options": [ + { + "text": "选项1", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "", + "hash": "115019" + }, + { + "text": "选项2", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "", + "hash": "115020" + } + ], + "importKey": "single", + "importData": "", + "cOption": "", + "cOptions": [], + "timeStep": { + "hour": 1, + "min": 10 + }, + "maxPhotos": 5, + "nps": { + "leftText": "极不满意", + "rightText": "极满意" + }, + "star": 5, + "exclude": false, + "addressType": 3, + "isAuto": false, + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + } + ] + }, + "submitConf": { + "submitTitle": "提交", + "confirmAgain": { + "is_again": true, + "again_text": "确认要提交吗?" + }, + "msgContent": { + "msg_200": "提交成功", + "msg_9001": "您来晚了,感谢支持问卷~", + "msg_9002": "请勿多次提交!", + "msg_9003": "您来晚了,已经满额!", + "msg_9004": "提交失败!" + } + }, + "bottomConf": { + "logoImage": "", + "logoImageWidth": "33%" + }, + "baseConf": { + "begTime": "2018-05-22 17:17:48", + "endTime": "2028-05-22 17:17:48", + "tLimit": "0", + "language": "chinese" + }, + "skinConf": { + "skinColor": "#4a4c5b", + "inputBgColor": "#ffffff" + } +} \ No newline at end of file diff --git a/server/src/apps/surveyManage/template/surveyTemplate/survey/nps.json b/server/src/apps/surveyManage/template/surveyTemplate/survey/nps.json new file mode 100644 index 00000000..c383c8c1 --- /dev/null +++ b/server/src/apps/surveyManage/template/surveyTemplate/survey/nps.json @@ -0,0 +1,140 @@ +{ + "submitConf": { + "submitTitle": "提交", + "confirmAgain": { + "is_again": true, + "again_text": "确认要提交吗?" + }, + "msgContent": { + "msg_200": "提交成功", + "msg_9001": "您来晚了,感谢支持问卷~", + "msg_9002": "请勿多次提交!", + "msg_9003": "您来晚了,已经满额!", + "msg_9004": "提交失败!" + } + }, + "skinConf": { + "skinColor": "#4a4c5b", + "inputBgColor": "#ffffff" + }, + "bottomConf": { + "logoImage": "", + "logoImageWidth": "40%" + }, + "bannerConf": { + "titleConfig": { + "mainTitle": "

满意度调研

 

为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,期待您的参与

", + "subTitle": "" + }, + "bannerConfig": { + "bgImage": "//img-hxy021.didistatic.com/static/starimg/img/BP0HXOXDv01698311607854.jpg", + "videoLink": "", + "postImg": "" + } + }, + "baseConf": { + "showVoteProcess": "allow", + "begTime": "2018-05-22 17:17:48", + "endTime": "2028-05-22 17:17:48", + "tLimit": "0", + "language": "chinese" + }, + "dataConf": { + "dataList": [ + { + "field": "data8", + "showIndex": true, + "showType": true, + "showSpliter": true, + "placeholderDesc": "", + "placeholder": "", + "isRequired": true, + "randomSort": false, + "innerRandom": false, + "hideSubTitleIndex": false, + "checked": false, + "minNum": "", + "maxNum": "", + "relyType": "and", + "extraOptions": [], + "importKey": "single", + "importData": "", + "npsMin": 0, + "addressType": 3, + "isAuto": false, + "urlKey": "", + "hasRely": true, + "relyList": [], + "jumpTo": "", + "optionOrigin": "", + "answerTip": "", + "type": "text", + "valid": "", + "title": "标题1", + "answer": "", + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + }, + { + "field": "data4", + "showIndex": true, + "showType": true, + "showSpliter": true, + "placeholderDesc": "", + "placeholder": "", + "isRequired": true, + "randomSort": false, + "innerRandom": false, + "hideSubTitleIndex": false, + "checked": false, + "minNum": "", + "maxNum": "", + "relyType": "and", + "extraOptions": [], + "importKey": "single", + "importData": "", + "cOption": "", + "cOptions": [], + "npsMin": 0, + "star": 5, + "addressType": 3, + "isAuto": false, + "urlKey": "", + "defaultProps": { + "children": "children", + "label": "name", + "id": "id" + }, + "hasRely": true, + "relyList": [], + "jumpTo": "", + "optionOrigin": "", + "answerTip": "", + "type": "radio-star", + "title": "标题3", + "answer": "", + "othersKeyMap": {}, + "options": [], + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + } + ] + } +} diff --git a/server/src/apps/surveyManage/template/surveyTemplate/survey/register.json b/server/src/apps/surveyManage/template/surveyTemplate/survey/register.json new file mode 100644 index 00000000..17514870 --- /dev/null +++ b/server/src/apps/surveyManage/template/surveyTemplate/survey/register.json @@ -0,0 +1,180 @@ +{ + "bannerConf": { + "titleConfig": { + "mainTitle": "

欢迎填写问卷

为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,期待您的参与!

", + "subTitle": "" + }, + "bannerConfig": { + "bgImage": "//img-hxy021.didistatic.com/static/starimg/img/BP0HXOXDv01698311607854.jpg", + "videoLink": "", + "postImg": "" + } + }, + "dataConf": { + "dataList": [ + { + "isRequired": true, + "showIndex": true, + "showType": true, + "showSpliter": true, + "type": "text", + "valid": "", + "field": "data458", + "title": "姓名", + "placeholder": "", + "randomSort": false, + "checked": false, + "minNum": "", + "maxNum": "", + "maxPhotos": 5, + "star": 5, + "timeStep": { + "hour": 1, + "min": 10 + }, + "nps": { + "leftText": "极不满意", + "rightText": "极满意" + }, + "exclude": false, + "relTypes": { + "textarea": "多行文本框", + "text": "单行输入框" + }, + "placeholderDesc": "", + "mhLimit": 0, + "addressType": 3, + "isAuto": false, + "jumpTo": "", + "startDate": "", + "endDate": "", + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + }, + { + "isRequired": true, + "showIndex": true, + "showType": true, + "showSpliter": true, + "type": "radio", + "placeholderDesc": "", + "field": "data515", + "title": "选择您感兴趣的课程进行报名", + "placeholder": "", + "valid": "", + "randomSort": false, + "checked": false, + "minNum": "", + "maxNum": "", + "options": [ + { + "text": "课程1", + "hash": "115019", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "" + }, + { + "text": "课程2", + "hash": "115020", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "" + }, + { + "text": "课程3", + "hash": "115021", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "" + }, + { + "text": "课程4", + "hash": "115022", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "" + } + ], + "timeStep": { + "hour": 1, + "min": 10 + }, + "maxPhotos": 5, + "nps": { + "leftText": "极不满意", + "rightText": "极满意" + }, + "star": 5, + "exclude": false, + "addressType": 3, + "isAuto": false, + "urlKey": "", + "defaultProps": { + "children": "children", + "label": "name", + "id": "id" + }, + "startDate": "", + "endDate": "", + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + } + ] + }, + "submitConf": { + "submitTitle": "提交", + "confirmAgain": { + "is_again": true, + "again_text": "确认要提交吗?" + }, + "msgContent": { + "msg_200": "提交成功", + "msg_9001": "您来晚了,感谢支持问卷~", + "msg_9002": "请勿多次提交!", + "msg_9003": "您来晚了,已经满额!", + "msg_9004": "提交失败!" + }, + "link": "" + }, + "bottomConf": { + "logoImage": "", + "logoImageWidth": "33%" + }, + "baseConf": { + "begTime": "2018-05-22 17:17:48", + "endTime": "2028-05-22 17:17:48", + "tLimit": "0", + "language": "chinese" + }, + "skinConf": { + "skinColor": "#4a4c5b", + "inputBgColor": "#ffffff" + } +} diff --git a/server/src/apps/surveyManage/template/surveyTemplate/survey/vote.json b/server/src/apps/surveyManage/template/surveyTemplate/survey/vote.json new file mode 100644 index 00000000..a133a311 --- /dev/null +++ b/server/src/apps/surveyManage/template/surveyTemplate/survey/vote.json @@ -0,0 +1,167 @@ +{ + "bannerConf": { + "titleConfig": { + "mainTitle": "

欢迎填写问卷

为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,期待您的参与!

", + "subTitle": "" + }, + "bannerConfig": { + "bgImage": "//img-hxy021.didistatic.com/static/starimg/img/BP0HXOXDv01698311607854.jpg", + "videoLink": "", + "postImg": "" + } + }, + "dataConf": { + "dataList": [ + { + "isRequired": true, + "showIndex": true, + "showType": true, + "showSpliter": true, + "type": "text", + "valid": "", + "field": "data631", + "title": "标题3", + "placeholder": "", + "sLimit": 1, + "randomSort": false, + "checked": false, + "minNum": "", + "maxNum": "", + "options": [ + { + "text": "选项1", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "" + }, + { + "text": "选项2", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "" + } + ], + "maxPhotos": 5, + "star": 5, + "timeStep": { + "hour": 1, + "min": 10 + }, + "nps": { + "leftText": "极不满意", + "rightText": "极满意" + }, + "exclude": false, + "relTypes": { + "textarea": "多行文本框", + "text": "单行输入框" + }, + "placeholderDesc": "", + "addressType": 3, + "isAuto": false, + "urlKey": "", + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + }, + { + "isRequired": true, + "showIndex": true, + "showType": true, + "showSpliter": true, + "type": "vote", + "innerType": "radio", + "placeholderDesc": "", + "field": "data606", + "title": "标题1", + "placeholder": "", + "randomSort": false, + "checked": false, + "minNum": "", + "maxNum": "", + "options": [ + { + "text": "甜的", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "", + "hash": "115019" + }, + { + "text": "咸的", + "imageUrl": "", + "others": false, + "mustOthers": false, + "othersKey": "", + "placeholderDesc": "", + "hash": "115020" + } + ], + "timeStep": { + "hour": 1, + "min": 10 + }, + "maxPhotos": 5, + "nps": { + "leftText": "极不满意", + "rightText": "极满意" + }, + "star": 5, + "addressType": 3, + "othersKeyMap": {}, + "textRange": { + "min": { + "placeholder": "0", + "value": 0 + }, + "max": { + "placeholder": "500", + "value": 500 + } + } + } + ] + }, + "submitConf": { + "submitTitle": "提交", + "confirmAgain": { + "is_again": true, + "again_text": "确认要提交吗?" + }, + "msgContent": { + "msg_200": "提交成功", + "msg_9001": "您来晚了,感谢支持问卷~", + "msg_9002": "请勿多次提交!", + "msg_9003": "您来晚了,已经满额!", + "msg_9004": "提交失败!" + } + }, + "bottomConf": { + "logoImage": "", + "logoImageWidth": "33%" + }, + "baseConf": { + "begTime": "2018-05-25 10:22:23", + "endTime": "2028-05-25 10:22:23", + "tLimit": "0", + "language": "chinese" + }, + "skinConf": { + "skinColor": "#4a4c5b", + "inputBgColor": "#ffffff" + } +} diff --git a/server/src/apps/surveyManage/template/surveyTemplate/templateBase.json b/server/src/apps/surveyManage/template/surveyTemplate/templateBase.json new file mode 100644 index 00000000..0ea4372f --- /dev/null +++ b/server/src/apps/surveyManage/template/surveyTemplate/templateBase.json @@ -0,0 +1,42 @@ +{ + "bannerConf": { + "titleConfig": { + "mainTitle": "

欢迎填写问卷

为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,期待您的参与!

", + "subTitle": "" + }, + "bannerConfig": { + "bgImage": "//img-hxy021.didistatic.com/static/starimg/img/BP0HXOXDv01698311607854.jpg", + "videoLink": "", + "postImg": "" + } + }, + "submitConf": { + "submitTitle": "提交", + "confirmAgain": { + "is_again": true, + "again_text": "确认要提交吗?" + }, + "msgContent": { + "msg_200": "提交成功", + "msg_9001": "您来晚了,感谢支持问卷~", + "msg_9002": "请勿多次提交!", + "msg_9003": "您来晚了,已经满额!", + "msg_9004": "提交失败!" + } + }, + "bottomConf": { + "logoImage": "", + "logoImageWidth": "28%" + }, + "baseConf": { + "begTime": "2018-05-30 10:38:31", + "endTime": "2028-05-30 10:38:31", + "tLimit": "0", + "language": "chinese", + "showVoteProcess": "allow" + }, + "skinConf": { + "skinColor": "#4a4c5b", + "inputBgColor": "#ffffff" + } + } diff --git a/server/src/apps/surveyManage/types/index.ts b/server/src/apps/surveyManage/types/index.ts new file mode 100644 index 00000000..e6372a59 --- /dev/null +++ b/server/src/apps/surveyManage/types/index.ts @@ -0,0 +1,43 @@ +export enum DICT_TYPE { + danger = "danger", + secret = "secret", +} + +export enum SURVEY_STATUS { + new = "new", + editing = "editing", + pausing = "pausing", + published = "published", + removed = "removed", +} + +export enum QUESTION_TYPE { + enps = "enps", + nps = "nps", + question = "question", //通用问卷 + register = "register", //报名 + vote = "vote", //投票 +} + +export enum HISTORY_TYPE { + dailyHis = "dailyHis", //保存历史 + publishHis = "publishHis", //发布历史 +} + +export interface UserType { + _id:string, + username:string, + password:string, + curStatus:any, + createDate:number +} + +export class CommonError extends Error { + code:number + errmsg:number + constructor(msg,code=500) { + super(msg) + this.errmsg = msg; + this.code = code; + } +} diff --git a/server/src/apps/surveyManage/utils/base58.ts b/server/src/apps/surveyManage/utils/base58.ts new file mode 100644 index 00000000..c2a62162 --- /dev/null +++ b/server/src/apps/surveyManage/utils/base58.ts @@ -0,0 +1,37 @@ +const base58KeysObject = { + "1":0,"2":1,"3":2,"4":3,"5":4,"6":5,"7":6,"8":7,"9":8, + "A":9,"B":10,"C":11,"D":12,"E":13,"F":14,"G":15,"H":16,"J":17, + "K":18,"L":19,"M":20,"N":21,"P":22,"Q":23,"R":24,"S":25,"T":26, + "U":27,"V":28,"W":29,"X":30,"Y":31,"Z":32, + "a":33,"b":34,"c":35,"d":36,"e":37,"f":38,"g":39,"h":40,"i":41,"j":42, + "k":43,"m":44,"n":45,"o":46,"p":47,"q":48,"r":49,"s":50,"t":51, + "u":52,"v":53,"w":54,"x":55,"y":56,"z":57 +}; +const base58Keys = Object.keys(base58KeysObject); +const base58Len = 58n; + +export function hex2Base58(hexNum:string):string +{ + let base58NumArray =[]; + let bigHexNumber = BigInt(`0x${hexNum}`); + while (bigHexNumber>=58n) + { + base58NumArray.unshift(base58Keys[(bigHexNumber % base58Len).toString()]); + bigHexNumber = bigHexNumber / base58Len; + } + base58NumArray.unshift(base58Keys[bigHexNumber.toString()]); + return base58NumArray.join(''); +} + +export function base582Hex(base58Num:string):string +{ + let base58NumArray =base58Num.split(''); + let big58Number = 0n; + let len = base58NumArray.length; + for(let i = 1;i<=len;i++) + { + let big58NumberTemp = BigInt(base58KeysObject[base58NumArray[len-i]])*(base58Len** BigInt(i-1)); + big58Number += big58NumberTemp; + } + return big58Number.toString(16); +} \ No newline at end of file diff --git a/server/src/apps/surveyManage/utils/index.ts b/server/src/apps/surveyManage/utils/index.ts new file mode 100644 index 00000000..5950a972 --- /dev/null +++ b/server/src/apps/surveyManage/utils/index.ts @@ -0,0 +1,49 @@ +import { SURVEY_STATUS } from '../types/index' +import { CommonError } from '../types/index' +import { hex2Base58 } from './base58' +import * as Joi from 'joi' + +export function getStatusObject({status}:{status:SURVEY_STATUS}) { + return { + status, + id: status, + date: Date.now(), + }; +} + +export function getValidateValue(validationResult:Joi.ValidationResult):T { + if(validationResult.error) { + throw new CommonError(validationResult.error.details.map(e=>e.message).join()) + } + return validationResult.value; +} + +export function genSurveyPath() { + return hex2Base58(process.hrtime.bigint().toString(16)) +} + +export function getMapByKey({data,key}:{data:Array,key:string}) { + const datamap = {} + for(const item of data) { + datamap[item[key]] = item + } + return datamap +} + +export function hanleSensitiveDate(value:string = ''): string { + if (!value) { + return '*' + } + + let str = '' + value + if (str.length === 1) { + str = '*' + } + if (str.length === 2) { + str = str[0] + '*' + } + if (str.length >= 3) { + str = str[0] + '***' + str.slice(str.length - 1) + } + return str +} \ No newline at end of file diff --git a/server/src/apps/surveyPublish/config/index.ts b/server/src/apps/surveyPublish/config/index.ts new file mode 100644 index 00000000..854dc6f0 --- /dev/null +++ b/server/src/apps/surveyPublish/config/index.ts @@ -0,0 +1,10 @@ +const config = { + mongo:{ + url: process.env.xiaojuSurveyMongoUrl ||'mongodb://localhost:27017', + dbName:'surveyEengine' + } +} + +export function getConfig() { + return config +} \ No newline at end of file diff --git a/server/src/apps/surveyPublish/db/mongo.ts b/server/src/apps/surveyPublish/db/mongo.ts new file mode 100644 index 00000000..f07d8989 --- /dev/null +++ b/server/src/apps/surveyPublish/db/mongo.ts @@ -0,0 +1,33 @@ +import { Collection, MongoClient, ObjectId } from 'mongodb' +import { getConfig } from '../config/index' + +const config = getConfig() + +class mongoService { + isInit:boolean + client:MongoClient + constructor() { + this.client = new MongoClient(config.mongo.url); + } + async getCollection({collectionName}):Promise { + await this.client.connect() + return this.client.db(config.mongo.dbName).collection(collectionName) + } + + convertId2StringByDoc(doc:any):any { + doc._id = doc._id.toString() + return doc; + } + + convertId2StringByList(list:Array):Array { + return list.map(e=>{ + return this.convertId2StringByDoc(e); + }) + } + + getObjectIdByStr(str:string) { + return new ObjectId(str) + } +} + +export const mongo = new mongoService() \ No newline at end of file diff --git a/server/src/apps/surveyPublish/index.ts b/server/src/apps/surveyPublish/index.ts new file mode 100644 index 00000000..25687b66 --- /dev/null +++ b/server/src/apps/surveyPublish/index.ts @@ -0,0 +1,53 @@ +import { SurveyServer } from '../../decorator' +import { Request, Response } from 'koa' +import { surveySubmitService } from './service/surveySubmitService' +import { surveyPublishService } from './service/surveyPublishService' +import { getValidateValue } from './utils/index' +import { checkSign } from './utils/checkSign' +import * as Joi from 'joi' + +export default class SurveyPublish { + // 获取发布配置 + @SurveyServer({ type: 'http', method: 'get', routerName: '/getSurveyPublish' }) + async getSurveyPublish({ req, res }: { req: Request, res: Response }) { + const surveySubmitData = getValidateValue(Joi.object({ + surveyPath: Joi.string().required(), + }).validate(req.query, { allowUnknown: true })); + const data = await surveyPublishService.get(surveySubmitData) + return { + code: 200, + data: data.surveyPublishRes, + } + } + // 获取投票 + @SurveyServer({ type: 'http', method: 'get', routerName: '/queryVote' }) + async queryVote({ req, res }: { req: Request, res: Response }) { + const params = getValidateValue(Joi.object({ + surveyPath: Joi.string().required(), + voteKeyList: Joi.string().required(), + }).validate(req.query, { allowUnknown: true })); + params.voteKeyList = params.voteKeyList.split(',') + const data = await surveyPublishService.queryVote(params) + return { + code: 200, + data: data, + } + } + // 提交问卷 + @SurveyServer({ type: 'http', method: 'post', routerName: '/submit' }) + async submit({ req, res }: { req: Request, res: Response }) { + // 检查签名 + checkSign(req.body) + // 校验参数 + const surveySubmitData = getValidateValue(Joi.object({ + surveyPath: Joi.string().required(), + data: Joi.string().required(), + encryptType: Joi.string(), + }).validate(req.body, { allowUnknown: true })); + await surveySubmitService.submit({ surveySubmitData }) + return { + code: 200, + msg: "报名成功", + } + } +} \ No newline at end of file diff --git a/server/src/apps/surveyPublish/package.json b/server/src/apps/surveyPublish/package.json new file mode 100644 index 00000000..bcbd1e33 --- /dev/null +++ b/server/src/apps/surveyPublish/package.json @@ -0,0 +1,13 @@ +{ + "name": "survey_publish", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "joi": "^17.9.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "mongodb": "^5.7.0" + }, + "devDependencies": {} +} diff --git a/server/src/apps/surveyPublish/service/surveyKeyStoreService.ts b/server/src/apps/surveyPublish/service/surveyKeyStoreService.ts new file mode 100644 index 00000000..951f9b5d --- /dev/null +++ b/server/src/apps/surveyPublish/service/surveyKeyStoreService.ts @@ -0,0 +1,56 @@ +import { mongo } from '../db/mongo' + +// 该服务用于模拟redis +class SurveyKeyStoreService { + getKeyStoreResult(surveyKeyStoreData:Array) { + const surveyKeyStoreReult = {} + for (const surveyKeyStoreItem of surveyKeyStoreData) { + surveyKeyStoreReult[surveyKeyStoreItem.key] = surveyKeyStoreItem.data + } + return surveyKeyStoreReult + } + + async set({surveyPath, key, data, type}) { + const surveyKeyStore = await mongo.getCollection({collectionName:'surveyKeyStore'}); + const setResult = await surveyKeyStore.updateOne({ + key, + surveyPath, + type + },{ + $set:{ + key, + surveyPath, + type, + data, + createDate:Date.now(), + updateDate:Date.now(), + } + },{ + upsert:true //如果不存在则插入 + }) + return setResult + } + + async get({surveyPath,key,type}) { + const surveyKeyStore = await mongo.getCollection({collectionName:'surveyKeyStore'}); + const surveyKeyStoreData = await surveyKeyStore.findOne({ + key, + surveyPath, + type + }) + return surveyKeyStoreData?.data + } + + async getAll({surveyPath,keyList,type}) { + const surveyKeyStore = await mongo.getCollection({collectionName:'surveyKeyStore'}); + const surveyKeyStoreData = await surveyKeyStore.find({ + key:{$in:keyList}, + surveyPath, + type + }).toArray() + return this.getKeyStoreResult(surveyKeyStoreData) + } + +} + +export const surveyKeyStoreService = new SurveyKeyStoreService() \ No newline at end of file diff --git a/server/src/apps/surveyPublish/service/surveyPublishService.ts b/server/src/apps/surveyPublish/service/surveyPublishService.ts new file mode 100644 index 00000000..66ea1479 --- /dev/null +++ b/server/src/apps/surveyPublish/service/surveyPublishService.ts @@ -0,0 +1,31 @@ +import { mongo } from '../db/mongo' +import { surveyKeyStoreService } from './surveyKeyStoreService' +import {CommonError} from '../types/index' + +class SurveyPublishService { + async get({surveyPath}:{surveyPath:string}) { + const surveyMeta = await mongo.getCollection({collectionName:'surveyMeta'}); + const surveyMetaData = await surveyMeta.findOne({surveyPath}) + if(!surveyMetaData) { + throw new CommonError('该问卷已不存在') + } + const surveyMetaRes = mongo.convertId2StringByDoc(surveyMetaData) + const surveyPublish = await mongo.getCollection({collectionName:'surveyPublish'}); + const surveyPublishData = await surveyPublish.findOne({pageId:surveyMetaRes._id.toString()},{sort:{createDate:-1}}) + if(!surveyPublishData) { + throw new CommonError('该问卷未发布') + } + const surveyPublishRes = mongo.convertId2StringByDoc(surveyPublishData) + return { + surveyMetaRes, + surveyPublishRes + } + } + + async queryVote({surveyPath,voteKeyList}:{surveyPath:string, voteKeyList:Array}) { + return await surveyKeyStoreService.getAll({surveyPath,keyList:voteKeyList,type:'vote'}) + } + +} + +export const surveyPublishService = new SurveyPublishService() \ No newline at end of file diff --git a/server/src/apps/surveyPublish/service/surveySubmitService.ts b/server/src/apps/surveyPublish/service/surveySubmitService.ts new file mode 100644 index 00000000..e2d6b2e8 --- /dev/null +++ b/server/src/apps/surveyPublish/service/surveySubmitService.ts @@ -0,0 +1,85 @@ +import { mongo } from '../db/mongo' +import { getStatusObject, getMapByKey } from '../utils/index' +import { SURVEY_STATUS, CommonError } from '../types/index' +import { surveyKeyStoreService } from './surveyKeyStoreService' +import * as moment from 'moment' + +class SurveySubmitService { + async submit({ surveySubmitData }: { surveySubmitData: any }) { + const surveyMeta = await mongo.getCollection({ collectionName: 'surveyMeta' }); + const surveyMetaRes = mongo.convertId2StringByDoc( + await surveyMeta.findOne({ surveyPath: surveySubmitData.surveyPath }) + ) + if (!surveyMetaRes) { + throw new CommonError('该问卷已不存在,无法提交') + } + const pageId = surveyMetaRes._id.toString() + const surveyPublish = await mongo.getCollection({ collectionName: 'surveyPublish' }); + const publishConf = await surveyPublish.findOne({ pageId }) + const surveySubmit = await mongo.getCollection({ collectionName: 'surveySubmit' }); + if (surveySubmitData.encryptType === 'base64') { + surveySubmitData.data = JSON.parse(decodeURIComponent(Buffer.from(surveySubmitData.data, "base64").toString())) + } else { + surveySubmitData.data = JSON.parse(surveySubmitData.data) + } + // 提交时间限制 + const begTime = publishConf?.code?.baseConf?.begTime || 0 + const endTime = publishConf?.code?.baseConf?.endTime || 0 + if (begTime && endTime) { + const nowStamp = Date.now() + const begTimeStamp = new Date(begTime).getTime() + const endTimeStamp = new Date(endTime).getTime() + if (nowStamp < begTimeStamp || nowStamp > endTimeStamp) { + throw new CommonError('不在答题有效期内') + } + } + // 提交时间段限制 + const answerBegTime = publishConf?.code?.baseConf?.answerBegTime || "00:00:00" + const answerEndTime = publishConf?.code?.baseConf?.answerEndTime || "23:59:59" + if (answerBegTime && answerEndTime) { + const nowStamp = Date.now() + const ymdString = moment().format('YYYY-MM-DD'); + const answerBegTimeStamp = new Date(`${ymdString} ${answerBegTime}`).getTime() + const answerEndTimeStamp = new Date(`${ymdString} ${answerEndTime}`).getTime() + if (nowStamp < answerBegTimeStamp || nowStamp > answerEndTimeStamp) { + throw new CommonError('不在答题时段内') + } + } + // 提交总数限制 + const tLimit = publishConf?.code?.baseConf?.tLimit || 0 + if (tLimit > 0) { + // 提升性能可以使用redis + let nowSubmitCount = await surveySubmit.countDocuments({ surveyPath: surveySubmitData.surveyPath }) || 0 + if (nowSubmitCount >= tLimit) { + throw new CommonError('超出提交总数限制') + } + } + // 投票信息保存 + const dataList = publishConf?.code?.dataConf?.dataList || [] + const dataListMap = getMapByKey({ data: dataList, key: 'field' }) + const surveySubmitDataKeys = Object.keys(surveySubmitData.data) + for (const field of surveySubmitDataKeys) { + const configData = dataListMap[field] + if (configData && /vote/.exec(configData.type)) { + const voteData = (await surveyKeyStoreService.get({ surveyPath: surveySubmitData.surveyPath, key: field, type: 'vote' })) || { total: 0 } + voteData.total++; + if (!voteData[surveySubmitData.data[field]]) { + voteData[surveySubmitData.data[field]] = 1 + } else { + voteData[surveySubmitData.data[field]]++; + } + await surveyKeyStoreService.set({ surveyPath: surveySubmitData.surveyPath, key: field, data: voteData, type: 'vote' }) + } + } + // 提交问卷 + const surveySubmitRes = await surveySubmit.insertOne({ + ...surveySubmitData, + pageId, + curStatus: getStatusObject({ status: SURVEY_STATUS.new }), + createDate: Date.now() + }) + return surveySubmitRes + } +} + +export const surveySubmitService = new SurveySubmitService() \ No newline at end of file diff --git a/server/src/apps/surveyPublish/types/index.ts b/server/src/apps/surveyPublish/types/index.ts new file mode 100644 index 00000000..5677c5eb --- /dev/null +++ b/server/src/apps/surveyPublish/types/index.ts @@ -0,0 +1,17 @@ +export enum SURVEY_STATUS { + new = "new", + editing = "editing", + pausing = "pausing", + published = "published", + removed = "removed", +} + +export class CommonError extends Error { + code:number + errmsg:string + constructor(msg,code=500) { + super(msg) + this.code = code; + this.errmsg = msg; + } +} \ No newline at end of file diff --git a/server/src/apps/surveyPublish/utils/checkSign.ts b/server/src/apps/surveyPublish/utils/checkSign.ts new file mode 100644 index 00000000..65e47138 --- /dev/null +++ b/server/src/apps/surveyPublish/utils/checkSign.ts @@ -0,0 +1,48 @@ +import { + createHash +} from 'crypto'; +import { CommonError } from '../types/index' + +const hash256 = (text) => { + return createHash('sha256').update(text).digest('hex') +} +const undefinedToString = (data) => { + const res = {} + for (const key in data) { + if (data[key] === undefined) { + res[key] = '' + } else { + res[key] = data[key] + } + } + return res; + } + + const getSignByData = (sourceData, ts) => { + const data = undefinedToString(sourceData) + const keysArr = Object.keys(data) + keysArr.sort() + let signArr = keysArr.map(key => { + if (typeof data[key] === 'string') { + return `${key}=${encodeURIComponent(data[key])}` + } + return `${key}=${JSON.stringify(data[key])}` + }) + const sign = hash256(signArr.join('') + ts) + return `${sign}` + } + + export const checkSign = (sourceData) =>{ + const sign = sourceData.sign + if(!sign) { + throw new CommonError('请求签名不存在') + } + delete sourceData.sign + const [inSign, ts] = sign.split('.'); + const realSign = getSignByData(sourceData, ts) + if(inSign!==realSign) { + throw new CommonError('请求签名异常') + } + return true; + } + \ No newline at end of file diff --git a/server/src/apps/surveyPublish/utils/index.ts b/server/src/apps/surveyPublish/utils/index.ts new file mode 100644 index 00000000..ebc962c5 --- /dev/null +++ b/server/src/apps/surveyPublish/utils/index.ts @@ -0,0 +1,25 @@ +import { SURVEY_STATUS } from '../types/index' +import { CommonError } from '../types/index' +import * as Joi from 'joi' + +export function getMapByKey({data,key}:{data:Array,key:string}) { + const datamap = {} + for(const item of data) { + datamap[item[key]] = item + } + return datamap +} + +export function getStatusObject({status}:{status:SURVEY_STATUS}) { + return { + status, + id: status, + date: Date.now(), + }; +} +export function getValidateValue(validationResult:Joi.ValidationResult):T { + if(validationResult.error) { + throw new CommonError(validationResult.error.details.map(e=>e.message).join()) + } + return validationResult.value; +} \ No newline at end of file diff --git a/server/src/apps/ui/index.ts b/server/src/apps/ui/index.ts new file mode 100644 index 00000000..d97a045a --- /dev/null +++ b/server/src/apps/ui/index.ts @@ -0,0 +1,29 @@ +import { SurveyServer } from '../../decorator' +import { Request, Response } from 'koa' +import { createReadStream } from 'fs' +import * as path from 'path' + +export default class UI { +@SurveyServer({ type: 'http', method: 'get', routerName: '/render/(.*)' }) + async render({ req, res }: {req:Request, res:Response}) { + const filePath = path.join(__dirname, 'public', 'render.html'); + res.type = path.extname(filePath) + return createReadStream(filePath) + } + @SurveyServer({ type: 'http', method: 'get', routerName: '/management/(.*)' }) + async management({ req, res }: {req:Request, res:Response}) { + const filePath = path.join(__dirname, 'public', 'management.html'); + res.type = path.extname(filePath) + return createReadStream(filePath) + } + @SurveyServer({ type: 'http', method: 'get', routerName: '/(.*)' }) + async index({ req, res }: {req:Request, res:Response}) { + let reqPath = req.path; + if (req.path === '/') { + reqPath = '/management.html' + } + const filePath = path.join(__dirname, 'public', reqPath); + res.type = path.extname(filePath) + return createReadStream(filePath) + } +} \ No newline at end of file diff --git a/server/src/apps/ui/package.json b/server/src/apps/ui/package.json new file mode 100644 index 00000000..a54c245f --- /dev/null +++ b/server/src/apps/ui/package.json @@ -0,0 +1,7 @@ +{ + "name": "ui", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": {} +} diff --git a/server/src/apps/ui/public/favicon.ico b/server/src/apps/ui/public/favicon.ico new file mode 100644 index 00000000..a06bccd4 Binary files /dev/null and b/server/src/apps/ui/public/favicon.ico differ diff --git a/server/src/apps/ui/public/management.html b/server/src/apps/ui/public/management.html new file mode 100644 index 00000000..641c3ad3 --- /dev/null +++ b/server/src/apps/ui/public/management.html @@ -0,0 +1,12 @@ + + + + + + + 问卷管理端 + + +

问卷管理端

+ + \ No newline at end of file diff --git a/server/src/apps/ui/public/render.html b/server/src/apps/ui/public/render.html new file mode 100644 index 00000000..871689e9 --- /dev/null +++ b/server/src/apps/ui/public/render.html @@ -0,0 +1,12 @@ + + + + + + + 问卷投放端 + + +

问卷投放端

+ + \ No newline at end of file diff --git a/server/src/apps/user/config/index.ts b/server/src/apps/user/config/index.ts new file mode 100644 index 00000000..a980147c --- /dev/null +++ b/server/src/apps/user/config/index.ts @@ -0,0 +1,14 @@ +const config = { + mongo:{ + url: process.env.xiaojuSurveyMongoUrl ||'mongodb://localhost:27017', + dbName:'surveyEengine' + }, + jwt:{ + secret: process.env.xiaojuSurveyJwtSecret || 'xiaojuSurveyJwtSecret', + expiresIn: process.env.xiaojuSurveyJwtExpiresIn || '8h', + } +} + +export function getConfig() { + return config +} \ No newline at end of file diff --git a/server/src/apps/user/db/mongo.ts b/server/src/apps/user/db/mongo.ts new file mode 100644 index 00000000..f07d8989 --- /dev/null +++ b/server/src/apps/user/db/mongo.ts @@ -0,0 +1,33 @@ +import { Collection, MongoClient, ObjectId } from 'mongodb' +import { getConfig } from '../config/index' + +const config = getConfig() + +class mongoService { + isInit:boolean + client:MongoClient + constructor() { + this.client = new MongoClient(config.mongo.url); + } + async getCollection({collectionName}):Promise { + await this.client.connect() + return this.client.db(config.mongo.dbName).collection(collectionName) + } + + convertId2StringByDoc(doc:any):any { + doc._id = doc._id.toString() + return doc; + } + + convertId2StringByList(list:Array):Array { + return list.map(e=>{ + return this.convertId2StringByDoc(e); + }) + } + + getObjectIdByStr(str:string) { + return new ObjectId(str) + } +} + +export const mongo = new mongoService() \ No newline at end of file diff --git a/server/src/apps/user/index.ts b/server/src/apps/user/index.ts new file mode 100644 index 00000000..69d9bd1b --- /dev/null +++ b/server/src/apps/user/index.ts @@ -0,0 +1,43 @@ +import { SurveyServer } from '../../decorator' +import { Request, Response } from 'koa' +import * as Joi from 'joi' +import { userService } from './service/userService' +import { getValidateValue } from './utils/index' + + +export default class User { + @SurveyServer({ type: 'http', method: 'post', routerName: '/register' }) + async register({ req, res }: { req: Request, res: Response }) { + const userInfo = getValidateValue(Joi.object({ + username: Joi.string().required(), + password: Joi.string().required(), + }).validate(req.body, { allowUnknown: true })); + const userRegisterRes = await userService.register(userInfo) + return { + code: 200, + data: userRegisterRes, + } + } + + @SurveyServer({ type: 'http', method: 'post', routerName: '/login' }) + async login({ req, res }: { req: Request, res: Response }) { + const userInfo = getValidateValue(Joi.object({ + username: Joi.string().required(), + password: Joi.string().required(), + }).validate(req.body, { allowUnknown: true })); + const data = await userService.login(userInfo) + return { + code: 200, + data, + } + } + + @SurveyServer({ type: 'rpc' }) + async getUserByToken({ params, context }: { params: any, context: any }) { + const data = await userService.getUserByToken({ token: params.token }) + return { + result: data, + context, // 上下文主要是传递调用方信息使用,比如traceid + } + } +} \ No newline at end of file diff --git a/server/src/apps/user/package.json b/server/src/apps/user/package.json new file mode 100644 index 00000000..613c7e74 --- /dev/null +++ b/server/src/apps/user/package.json @@ -0,0 +1,13 @@ +{ + "name": "user", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "joi": "^17.9.2", + "jsonwebtoken": "^9.0.1", + "lodash": "^4.17.21", + "mongodb": "^5.7.0" + }, + "devDependencies": {} +} diff --git a/server/src/apps/user/service/userService.ts b/server/src/apps/user/service/userService.ts new file mode 100644 index 00000000..a2806f1d --- /dev/null +++ b/server/src/apps/user/service/userService.ts @@ -0,0 +1,81 @@ +import { + verify as jwtVerify, + sign as jwtSign +} from 'jsonwebtoken'; +import { + createHash +} from 'crypto'; +import { mongo } from '../db/mongo' +import { getStatusObject } from '../utils/index' +import { SURVEY_STATUS, CommonError } from '../types/index' +import { getConfig } from '../config/index' +const config = getConfig() + + +class UserService { + + hash256(text) { + return createHash('sha256').update(text).digest('hex') + } + + + getToken(userInfo) { + return jwtSign(userInfo, config.jwt.secret, { expiresIn: config.jwt.expiresIn }); + } + + async register(userInfo:{username:string, password:string}) { + const user = await mongo.getCollection({collectionName:'user'}); + const userRes = await user.findOne({ + username:userInfo.username, + }) + if(userRes) { + throw new CommonError('该用户已存在') + } + const userInsertRes = await user.insertOne({ + username:userInfo.username, + password:this.hash256(userInfo.password), + curStatus:getStatusObject({status:SURVEY_STATUS.new}), + createDate:Date.now() + }) + const token = this.getToken({ + _id: userInsertRes.insertedId.toString(), + username:userInfo.username + }); + return {userInsertRes, token, username:userInfo.username} + } + + async login(userInfo:{username:string, password:string}) { + const user = await mongo.getCollection({collectionName:'user'}); + const userRes = await user.findOne({ + username:userInfo.username, + password:this.hash256(userInfo.password), + }) + if(!userRes) { + throw new CommonError('用户名或密码错误') + } + const token = this.getToken({ + _id: userRes._id.toString(), + username:userInfo.username + }); + return {token, username:userInfo.username} + } + + async getUserByToken(tokenInfo:{token:string}) { + let userInfo; + try { + userInfo = jwtVerify(tokenInfo.token, config.jwt.secret) + } catch(err) { + throw new CommonError('用户凭证无效或已过期',403) + } + const user = await mongo.getCollection({collectionName:'user'}); + const userRes = await user.findOne({ + _id:mongo.getObjectIdByStr(userInfo._id), + }) + if(!userRes) { + throw new CommonError('用户已不存在') + } + return mongo.convertId2StringByDoc(userRes); + } +} + +export const userService = new UserService() \ No newline at end of file diff --git a/server/src/apps/user/types/index.ts b/server/src/apps/user/types/index.ts new file mode 100644 index 00000000..7284e4e1 --- /dev/null +++ b/server/src/apps/user/types/index.ts @@ -0,0 +1,30 @@ +export enum SURVEY_STATUS { + new = "new", + editing = "editing", + pausing = "pausing", + published = "published", + removed = "removed", +} + +export enum QUESTION_TYPE { + enps = "enps", + nps = "nps", + question = "question", //通用问卷 + register = "register", //报名 + vote = "vote", //投票 +} + +export enum HISTORY_TYPE { + dailyHis = "dailyHis", //保存历史 + publishHis = "publishHis", //发布历史 +} + +export class CommonError extends Error { + code:number + errmsg:string + constructor(msg,code=500) { + super(msg) + this.code = code; + this.errmsg = msg; + } +} \ No newline at end of file diff --git a/server/src/apps/user/utils/index.ts b/server/src/apps/user/utils/index.ts new file mode 100644 index 00000000..3074cca5 --- /dev/null +++ b/server/src/apps/user/utils/index.ts @@ -0,0 +1,16 @@ +import { SURVEY_STATUS } from '../types/index' +import { CommonError } from '../types/index' +import * as Joi from 'joi' +export function getStatusObject({status}:{status:SURVEY_STATUS}) { + return { + status, + id: status, + date: Date.now(), + }; +} +export function getValidateValue(validationResult:Joi.ValidationResult):T { + if(validationResult.error) { + throw new CommonError(validationResult.error.details.map(e=>e.message).join()) + } + return validationResult.value; +} \ No newline at end of file diff --git a/server/src/decorator.ts b/server/src/decorator.ts new file mode 100644 index 00000000..49c6173e --- /dev/null +++ b/server/src/decorator.ts @@ -0,0 +1,19 @@ +type ServerType = 'http' | 'websocket' | 'rpc' +export interface ServerValue { + type: ServerType, + method: 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options'; + routerName: string; +} + +export const SurveyServerConfigKey = Symbol('appConfig') // vm环境和worker环境上下文不一致导致不能使用Symbol +export function SurveyServer(surveyServer) { + return function (target: any, propertyKey: string, _descriptor: PropertyDescriptor) { + if (!target[SurveyServerConfigKey]) { + target[SurveyServerConfigKey] = new Map() + } + target[SurveyServerConfigKey].set( + propertyKey, + surveyServer + ) + } +} \ No newline at end of file diff --git a/server/src/index.ts b/server/src/index.ts new file mode 100644 index 00000000..1ea341b1 --- /dev/null +++ b/server/src/index.ts @@ -0,0 +1,21 @@ +import * as os from 'os' +import * as Koa from 'koa'; +import * as KoaBodyparser from 'koa-bodyparser' +import * as logger from 'koa-pino-logger' +import { getRouter } from './router' +import { outputCatch } from './middleware/outputCatch' + +const app = new Koa(); +app.use(outputCatch({ showErrorStack: true })) +app.use(logger()) +app.use(KoaBodyparser({ + formLimit: '30mb', + jsonLimit: '30mb', + textLimit: '30mb', + xmlLimit: '30mb', +})) + +app.use(getRouter().routes()) +const port = 8080 +app.listen(port) +process.stdout.write(`${os.EOL}server run: http://127.0.0.1:${port} ${os.EOL}`) \ No newline at end of file diff --git a/server/src/middleware/outputCatch.ts b/server/src/middleware/outputCatch.ts new file mode 100644 index 00000000..a73ca131 --- /dev/null +++ b/server/src/middleware/outputCatch.ts @@ -0,0 +1,13 @@ +export function outputCatch({showErrorStack}:{showErrorStack:boolean}) { + return async function (ctx, next) { + try{ + await next() + } catch(err) { + const outputData = {...err} + if(showErrorStack) { + outputData.stack = err.stack; + } + return ctx.body = outputData + } + } +} \ No newline at end of file diff --git a/server/src/router.ts b/server/src/router.ts new file mode 100644 index 00000000..13839d8b --- /dev/null +++ b/server/src/router.ts @@ -0,0 +1,39 @@ +import * as Router from 'koa-router'; +import { Context } from 'koa' +import { SurveyServerConfigKey } from './decorator'; + +import Ui from './apps/ui/index' +import SurveyManage from './apps/surveyManage/index' +import SurveyPublish from './apps/surveyPublish/index' +import User from './apps/user/index' + + +function loadAppRouter(app, appRouter) { + const appServerConfigMap = app[SurveyServerConfigKey] + for (const [serveName, serveValue] of appServerConfigMap) { + const middleware = async (ctx: Context) => { + const data = await app[serveName]({ req: ctx.request, res: ctx.response }) + return ctx.body = data + } + const method = serveValue.method || 'all' + const routerName = serveValue.routerName || `/${serveName}` + appRouter[method](routerName, middleware) + } + return appRouter +} + +export function getRouter() { + const rootRouter = new Router() + const apiAppMap = { + surveyManage: new SurveyManage(), + surveyPublish: new SurveyPublish(), + user: new User(), + } + for (const [apiAppName, apiApp] of Object.entries(apiAppMap)) { + const appRouter = new Router() + loadAppRouter(apiApp, appRouter) + rootRouter.use(`/api/${apiAppName}`, appRouter.routes(), rootRouter.allowedMethods()) + } + loadAppRouter(new Ui(), rootRouter) + return rootRouter +} \ No newline at end of file diff --git a/server/src/rpc.ts b/server/src/rpc.ts new file mode 100644 index 00000000..26caf494 --- /dev/null +++ b/server/src/rpc.ts @@ -0,0 +1,11 @@ +export async function rpcInvote(appServerName: string, params: P): Promise { + const appServerNameData = /^(\w+)\.(\w+)$/.exec(appServerName); + if (!appServerNameData) { + throw new Error('rpc调用必须按照app.function名方式填写,app和function名称只支持数字字母下划线') + } + const appName = appServerNameData[1]; + const serverName = appServerNameData[2]; + const App = require(`./apps/${appName}/index`).default + const instance = new App() + return await instance[serverName](params) +} \ No newline at end of file diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 00000000..11b5a06e --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target":"ES2020", + "rootDir": "./src/", + "outDir": "./build/", + "declaration": true, + "experimentalDecorators": true, + "sourceMap": true, + "incremental":true, + "tsBuildInfoFile": "./build/tsconfig.tsbuildinfo" + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/web/.browserslistrc b/web/.browserslistrc new file mode 100644 index 00000000..214388fe --- /dev/null +++ b/web/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not dead diff --git a/web/.eslintrc.js b/web/.eslintrc.js new file mode 100644 index 00000000..6a92b6a6 --- /dev/null +++ b/web/.eslintrc.js @@ -0,0 +1,20 @@ +module.exports = { + root: false, + env: { + node: true, + }, + extends: [ + 'plugin:vue/essential', + 'eslint:recommended', + 'plugin:prettier/recommended', + ], + parserOptions: { + parser: '@babel/eslint-parser', + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'vue/multi-word-component-names': 'off', + semi: ['error', 'always'], + }, +}; diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 00000000..9effb928 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,27 @@ +.DS_Store +node_modules +/dist +/output + +# local env files +# .env.*.local 提交 .env.development.local,使得用户能够在本地修改 +.env.production.local +.env.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +package-lock.json + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.history \ No newline at end of file diff --git a/web/.prettierrc.js b/web/.prettierrc.js new file mode 100644 index 00000000..42b53e57 --- /dev/null +++ b/web/.prettierrc.js @@ -0,0 +1,5 @@ +module.exports = { + singleQuote: true, // 使用单引号 + semi: true, // 不使用分号 + // trailingComma: 'all', // 在对象和数组末尾加上逗号 +}; diff --git a/web/README.md b/web/README.md new file mode 100644 index 00000000..e721dffd --- /dev/null +++ b/web/README.md @@ -0,0 +1,44 @@ +## 环境 +node版本推荐>=v16.15.0 + +## 项目启动 +1、安装依赖 +``` +npm install +``` +2、启动 +``` +npm run serve +``` +3、访问问卷管理端 +```bash +http://localhost:8080/management +``` +会自动重定向到问卷列表页,也就是问卷管理端系统的首页 +```bash +http://localhost:8080/management/survey +``` +问卷管理端所有的页面都需要登陆,需要自行注册账号 + +4、访问问卷投放端 +创建一份问卷并且编辑好之后,需要点击发布,发布后会跳转到问卷投放页面 +投放页面能看到问卷的问卷投放端的链接,点击打开即可访问 +或者如果你知道问卷配置的surveyPath字段,也可以通过下面的路径直接访问某张问卷 +```bash +http://localhost:8080/render/:surveyPath +``` + +5、编译 +执行下面的命令即可编译项目 +``` +npm run build +``` +编译结果会产出两个html:management.html和render.html + +6、部署和访问 +前端的部署和访问依赖服务端 +需要先将整个dist文件夹里面的内容移动到后端的静态文件夹下面 +需要后端做一层代理: +当访问路径由/management开头的时候,读取management.html的内容返回 +当访问路径由/render开头的时候,读取render.html的内容返回 +此功能已经实现,做一个简单了解即可 diff --git a/web/babel.config.js b/web/babel.config.js new file mode 100644 index 00000000..104f822b --- /dev/null +++ b/web/babel.config.js @@ -0,0 +1,11 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset', + [ + '@vue/babel-preset-jsx', + { + injectH: false, + }, + ], + ], +}; diff --git a/web/jsconfig.json b/web/jsconfig.json new file mode 100644 index 00000000..4aafc5f6 --- /dev/null +++ b/web/jsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "baseUrl": "./", + "moduleResolution": "node", + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 00000000..ba2a1c1c --- /dev/null +++ b/web/package.json @@ -0,0 +1,56 @@ +{ + "name": "web", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint", + "lintfix": "eslint --fix ." + }, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-preset-jsx": "^1.4.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "1.0.2", + "axios": "^1.4.0", + "clipboard": "^2.0.11", + "core-js": "^3.8.3", + "crypto-js": "^4.1.1", + "element-ui": "^2.15.13", + "moment": "^2.29.4", + "qrcode": "^1.5.3", + "vue": "^2.7.14", + "vue-demi": "^0.14.5", + "vue-router": "^3.5.1", + "vuedraggable": "^2.24.3", + "vuex": "^3.6.2", + "xss": "^1.0.14" + }, + "devDependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "@vue/cli-plugin-babel": "~5.0.0", + "@vue/cli-plugin-eslint": "~5.0.0", + "@vue/cli-plugin-router": "~5.0.0", + "@vue/cli-plugin-vuex": "~5.0.0", + "@vue/cli-service": "~5.0.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.7.1", + "less-loader": "^11.1.3", + "postcss-import": "^15.1.0", + "postcss-url": "^10.1.3", + "prettier": "^2.4.1", + "sass": "^1.32.7", + "sass-loader": "^12.0.0", + "style-resources-loader": "^1.5.0", + "vue-style-loader": "^4.1.3", + "vue-template-compiler": "^2.7.14" + }, + "engines": { + "node": ">=16.11.1", + "npm": ">=8.0.0" + } +} diff --git a/web/public/imgs/Logo.jpg b/web/public/imgs/Logo.jpg new file mode 100644 index 00000000..1c819a7e Binary files /dev/null and b/web/public/imgs/Logo.jpg differ diff --git a/web/public/imgs/avatar.png b/web/public/imgs/avatar.png new file mode 100644 index 00000000..c71722a5 Binary files /dev/null and b/web/public/imgs/avatar.png differ diff --git a/web/public/imgs/create/background.jpg b/web/public/imgs/create/background.jpg new file mode 100644 index 00000000..0a8a556e Binary files /dev/null and b/web/public/imgs/create/background.jpg differ diff --git a/web/public/imgs/create/normal-icon.png b/web/public/imgs/create/normal-icon.png new file mode 100644 index 00000000..4b71db27 Binary files /dev/null and b/web/public/imgs/create/normal-icon.png differ diff --git a/web/public/imgs/create/nps-icon.png b/web/public/imgs/create/nps-icon.png new file mode 100644 index 00000000..de64f45a Binary files /dev/null and b/web/public/imgs/create/nps-icon.png differ diff --git a/web/public/imgs/create/register-icon.png b/web/public/imgs/create/register-icon.png new file mode 100644 index 00000000..eb33a603 Binary files /dev/null and b/web/public/imgs/create/register-icon.png differ diff --git a/web/public/imgs/create/vote-icon.png b/web/public/imgs/create/vote-icon.png new file mode 100644 index 00000000..3289bd0b Binary files /dev/null and b/web/public/imgs/create/vote-icon.png differ diff --git a/web/public/imgs/favicon.ico b/web/public/imgs/favicon.ico new file mode 100644 index 00000000..25f2a0fc Binary files /dev/null and b/web/public/imgs/favicon.ico differ diff --git a/web/public/imgs/icons/analysis-empty.png b/web/public/imgs/icons/analysis-empty.png new file mode 100644 index 00000000..255bd16a Binary files /dev/null and b/web/public/imgs/icons/analysis-empty.png differ diff --git a/web/public/imgs/icons/error.png b/web/public/imgs/icons/error.png new file mode 100644 index 00000000..b116632a Binary files /dev/null and b/web/public/imgs/icons/error.png differ diff --git a/web/public/imgs/icons/list-empty.png b/web/public/imgs/icons/list-empty.png new file mode 100644 index 00000000..f59e6148 Binary files /dev/null and b/web/public/imgs/icons/list-empty.png differ diff --git a/web/public/imgs/icons/overtime.png b/web/public/imgs/icons/overtime.png new file mode 100644 index 00000000..8b405722 Binary files /dev/null and b/web/public/imgs/icons/overtime.png differ diff --git a/web/public/imgs/icons/success.png b/web/public/imgs/icons/success.png new file mode 100644 index 00000000..e496ba78 Binary files /dev/null and b/web/public/imgs/icons/success.png differ diff --git a/web/public/imgs/icons/unpublished.png b/web/public/imgs/icons/unpublished.png new file mode 100644 index 00000000..0443c494 Binary files /dev/null and b/web/public/imgs/icons/unpublished.png differ diff --git a/web/public/imgs/icons/unselected.png b/web/public/imgs/icons/unselected.png new file mode 100644 index 00000000..3f9243b0 Binary files /dev/null and b/web/public/imgs/icons/unselected.png differ diff --git a/web/public/imgs/phone-bg.png b/web/public/imgs/phone-bg.png new file mode 100644 index 00000000..a74c7749 Binary files /dev/null and b/web/public/imgs/phone-bg.png differ diff --git a/web/public/imgs/question-type-snapshot/11iAo3ca0u1657702225416.png b/web/public/imgs/question-type-snapshot/11iAo3ca0u1657702225416.png new file mode 100644 index 00000000..274186d7 Binary files /dev/null and b/web/public/imgs/question-type-snapshot/11iAo3ca0u1657702225416.png differ diff --git a/web/public/imgs/question-type-snapshot/7CU6tn4XqT1657702221208.png b/web/public/imgs/question-type-snapshot/7CU6tn4XqT1657702221208.png new file mode 100644 index 00000000..4589b483 Binary files /dev/null and b/web/public/imgs/question-type-snapshot/7CU6tn4XqT1657702221208.png differ diff --git a/web/public/imgs/question-type-snapshot/CbqKEdxREF1657702225150.png b/web/public/imgs/question-type-snapshot/CbqKEdxREF1657702225150.png new file mode 100644 index 00000000..2c7ddace Binary files /dev/null and b/web/public/imgs/question-type-snapshot/CbqKEdxREF1657702225150.png differ diff --git a/web/public/imgs/question-type-snapshot/Md2YmzBBpV1657702223744.png b/web/public/imgs/question-type-snapshot/Md2YmzBBpV1657702223744.png new file mode 100644 index 00000000..f1e22cd0 Binary files /dev/null and b/web/public/imgs/question-type-snapshot/Md2YmzBBpV1657702223744.png differ diff --git a/web/public/imgs/question-type-snapshot/TgeRDfURJZ1657702220602.png b/web/public/imgs/question-type-snapshot/TgeRDfURJZ1657702220602.png new file mode 100644 index 00000000..baf53b3b Binary files /dev/null and b/web/public/imgs/question-type-snapshot/TgeRDfURJZ1657702220602.png differ diff --git a/web/public/imgs/question-type-snapshot/blW8U1ckzd1657702223023.png b/web/public/imgs/question-type-snapshot/blW8U1ckzd1657702223023.png new file mode 100644 index 00000000..0621bc00 Binary files /dev/null and b/web/public/imgs/question-type-snapshot/blW8U1ckzd1657702223023.png differ diff --git a/web/public/imgs/question-type-snapshot/hC3e3UBJvZ1666842030883.png b/web/public/imgs/question-type-snapshot/hC3e3UBJvZ1666842030883.png new file mode 100644 index 00000000..5e53683d Binary files /dev/null and b/web/public/imgs/question-type-snapshot/hC3e3UBJvZ1666842030883.png differ diff --git a/web/public/imgs/question-type-snapshot/iL84te6xxU1657702189333.png b/web/public/imgs/question-type-snapshot/iL84te6xxU1657702189333.png new file mode 100644 index 00000000..22e40796 Binary files /dev/null and b/web/public/imgs/question-type-snapshot/iL84te6xxU1657702189333.png differ diff --git a/web/public/imgs/question-type-snapshot/nGTscsZlwn1657702222857.png b/web/public/imgs/question-type-snapshot/nGTscsZlwn1657702222857.png new file mode 100644 index 00000000..80b2859d Binary files /dev/null and b/web/public/imgs/question-type-snapshot/nGTscsZlwn1657702222857.png differ diff --git a/web/public/imgs/question-type-snapshot/vDk11mEfnF1657702221336.png b/web/public/imgs/question-type-snapshot/vDk11mEfnF1657702221336.png new file mode 100644 index 00000000..d200ad01 Binary files /dev/null and b/web/public/imgs/question-type-snapshot/vDk11mEfnF1657702221336.png differ diff --git a/web/public/imgs/s-logo.jpg b/web/public/imgs/s-logo.jpg new file mode 100644 index 00000000..b0c58b1f Binary files /dev/null and b/web/public/imgs/s-logo.jpg differ diff --git a/web/public/imgs/skin/0k7Jg7In8I1558430221154.jpg b/web/public/imgs/skin/0k7Jg7In8I1558430221154.jpg new file mode 100644 index 00000000..7734b9ff Binary files /dev/null and b/web/public/imgs/skin/0k7Jg7In8I1558430221154.jpg differ diff --git a/web/public/imgs/skin/145gBCRtNP1558514861211.jpg b/web/public/imgs/skin/145gBCRtNP1558514861211.jpg new file mode 100644 index 00000000..a977fc87 Binary files /dev/null and b/web/public/imgs/skin/145gBCRtNP1558514861211.jpg differ diff --git a/web/public/imgs/skin/17e06b7604a007e1d3e1453b9ddadc3c.jpg b/web/public/imgs/skin/17e06b7604a007e1d3e1453b9ddadc3c.jpg new file mode 100644 index 00000000..9bcfdbaa Binary files /dev/null and b/web/public/imgs/skin/17e06b7604a007e1d3e1453b9ddadc3c.jpg differ diff --git a/web/public/imgs/skin/3ABKqvDaVn1558514860472.jpg b/web/public/imgs/skin/3ABKqvDaVn1558514860472.jpg new file mode 100644 index 00000000..b003940d Binary files /dev/null and b/web/public/imgs/skin/3ABKqvDaVn1558514860472.jpg differ diff --git a/web/public/imgs/skin/4aWi5JxG471558514268698.jpg b/web/public/imgs/skin/4aWi5JxG471558514268698.jpg new file mode 100644 index 00000000..11824550 Binary files /dev/null and b/web/public/imgs/skin/4aWi5JxG471558514268698.jpg differ diff --git a/web/public/imgs/skin/5OCvbjqJQm1558430220362.jpg b/web/public/imgs/skin/5OCvbjqJQm1558430220362.jpg new file mode 100644 index 00000000..ea1a00a2 Binary files /dev/null and b/web/public/imgs/skin/5OCvbjqJQm1558430220362.jpg differ diff --git a/web/public/imgs/skin/6xQk1IAmKt1558514269874.jpg b/web/public/imgs/skin/6xQk1IAmKt1558514269874.jpg new file mode 100644 index 00000000..d6b0683f Binary files /dev/null and b/web/public/imgs/skin/6xQk1IAmKt1558514269874.jpg differ diff --git a/web/public/imgs/skin/A9FzlbYXqI1558430905739.jpg b/web/public/imgs/skin/A9FzlbYXqI1558430905739.jpg new file mode 100644 index 00000000..385f4fc7 Binary files /dev/null and b/web/public/imgs/skin/A9FzlbYXqI1558430905739.jpg differ diff --git a/web/public/imgs/skin/CxQkSU6AY21558430526163.jpg b/web/public/imgs/skin/CxQkSU6AY21558430526163.jpg new file mode 100644 index 00000000..7e875605 Binary files /dev/null and b/web/public/imgs/skin/CxQkSU6AY21558430526163.jpg differ diff --git a/web/public/imgs/skin/ElNeqJT2I21558430526165.jpg b/web/public/imgs/skin/ElNeqJT2I21558430526165.jpg new file mode 100644 index 00000000..90e7d819 Binary files /dev/null and b/web/public/imgs/skin/ElNeqJT2I21558430526165.jpg differ diff --git a/web/public/imgs/skin/FRIzPC6ZtN1558430221344.jpg b/web/public/imgs/skin/FRIzPC6ZtN1558430221344.jpg new file mode 100644 index 00000000..90de8eb8 Binary files /dev/null and b/web/public/imgs/skin/FRIzPC6ZtN1558430221344.jpg differ diff --git a/web/public/imgs/skin/GnPatsr48Z1558430904680.jpg b/web/public/imgs/skin/GnPatsr48Z1558430904680.jpg new file mode 100644 index 00000000..74179851 Binary files /dev/null and b/web/public/imgs/skin/GnPatsr48Z1558430904680.jpg differ diff --git a/web/public/imgs/skin/HN9YGctDeF1558430906686.jpg b/web/public/imgs/skin/HN9YGctDeF1558430906686.jpg new file mode 100644 index 00000000..be5156c7 Binary files /dev/null and b/web/public/imgs/skin/HN9YGctDeF1558430906686.jpg differ diff --git a/web/public/imgs/skin/HuVqqtbFjs1558514860570.jpg b/web/public/imgs/skin/HuVqqtbFjs1558514860570.jpg new file mode 100644 index 00000000..1e8749d2 Binary files /dev/null and b/web/public/imgs/skin/HuVqqtbFjs1558514860570.jpg differ diff --git a/web/public/imgs/skin/Ixx8hqiwwk1660979120801.jpg b/web/public/imgs/skin/Ixx8hqiwwk1660979120801.jpg new file mode 100644 index 00000000..61f471f6 Binary files /dev/null and b/web/public/imgs/skin/Ixx8hqiwwk1660979120801.jpg differ diff --git a/web/public/imgs/skin/N9Z2ZuyO731558434537314.jpg b/web/public/imgs/skin/N9Z2ZuyO731558434537314.jpg new file mode 100644 index 00000000..4bc8858a Binary files /dev/null and b/web/public/imgs/skin/N9Z2ZuyO731558434537314.jpg differ diff --git a/web/public/imgs/skin/NnXsAOhBNm1558430219312.jpg b/web/public/imgs/skin/NnXsAOhBNm1558430219312.jpg new file mode 100644 index 00000000..2437dceb Binary files /dev/null and b/web/public/imgs/skin/NnXsAOhBNm1558430219312.jpg differ diff --git a/web/public/imgs/skin/O409pRTDlW1558430905738.jpg b/web/public/imgs/skin/O409pRTDlW1558430905738.jpg new file mode 100644 index 00000000..066d19e4 Binary files /dev/null and b/web/public/imgs/skin/O409pRTDlW1558430905738.jpg differ diff --git a/web/public/imgs/skin/OewuaQmWoq1558514860285.jpg b/web/public/imgs/skin/OewuaQmWoq1558514860285.jpg new file mode 100644 index 00000000..8801102d Binary files /dev/null and b/web/public/imgs/skin/OewuaQmWoq1558514860285.jpg differ diff --git a/web/public/imgs/skin/OnSdbm7u6n1558434536641.jpg b/web/public/imgs/skin/OnSdbm7u6n1558434536641.jpg new file mode 100644 index 00000000..ac267b61 Binary files /dev/null and b/web/public/imgs/skin/OnSdbm7u6n1558434536641.jpg differ diff --git a/web/public/imgs/skin/PLwNH1rAie1558430219772.jpg b/web/public/imgs/skin/PLwNH1rAie1558430219772.jpg new file mode 100644 index 00000000..3ea50e04 Binary files /dev/null and b/web/public/imgs/skin/PLwNH1rAie1558430219772.jpg differ diff --git a/web/public/imgs/skin/POHlQiSwPR1558514270379.jpg b/web/public/imgs/skin/POHlQiSwPR1558514270379.jpg new file mode 100644 index 00000000..eca2d476 Binary files /dev/null and b/web/public/imgs/skin/POHlQiSwPR1558514270379.jpg differ diff --git a/web/public/imgs/skin/PUssufh5uI1558430905104.jpg b/web/public/imgs/skin/PUssufh5uI1558430905104.jpg new file mode 100644 index 00000000..64e6da09 Binary files /dev/null and b/web/public/imgs/skin/PUssufh5uI1558430905104.jpg differ diff --git a/web/public/imgs/skin/Qu9rg33wmq1558514861015.jpg b/web/public/imgs/skin/Qu9rg33wmq1558514861015.jpg new file mode 100644 index 00000000..80d7650c Binary files /dev/null and b/web/public/imgs/skin/Qu9rg33wmq1558514861015.jpg differ diff --git a/web/public/imgs/skin/SHs0K703Yn1558430527218.jpg b/web/public/imgs/skin/SHs0K703Yn1558430527218.jpg new file mode 100644 index 00000000..99b5d92b Binary files /dev/null and b/web/public/imgs/skin/SHs0K703Yn1558430527218.jpg differ diff --git a/web/public/imgs/skin/SyiLRcukyE1558430525760.jpg b/web/public/imgs/skin/SyiLRcukyE1558430525760.jpg new file mode 100644 index 00000000..6d90fc07 Binary files /dev/null and b/web/public/imgs/skin/SyiLRcukyE1558430525760.jpg differ diff --git a/web/public/imgs/skin/UH0A8DbTai1558430221033.jpg b/web/public/imgs/skin/UH0A8DbTai1558430221033.jpg new file mode 100644 index 00000000..be9eb14f Binary files /dev/null and b/web/public/imgs/skin/UH0A8DbTai1558430221033.jpg differ diff --git a/web/public/imgs/skin/UqIvVvEXAK1558430905204.jpg b/web/public/imgs/skin/UqIvVvEXAK1558430905204.jpg new file mode 100644 index 00000000..122c6a66 Binary files /dev/null and b/web/public/imgs/skin/UqIvVvEXAK1558430905204.jpg differ diff --git a/web/public/imgs/skin/VTUwbp6vY61558430527320.jpg b/web/public/imgs/skin/VTUwbp6vY61558430527320.jpg new file mode 100644 index 00000000..62f4c95c Binary files /dev/null and b/web/public/imgs/skin/VTUwbp6vY61558430527320.jpg differ diff --git a/web/public/imgs/skin/W5PPlNsmsr1558514269088.jpg b/web/public/imgs/skin/W5PPlNsmsr1558514269088.jpg new file mode 100644 index 00000000..f5332f18 Binary files /dev/null and b/web/public/imgs/skin/W5PPlNsmsr1558514269088.jpg differ diff --git a/web/public/imgs/skin/XQE2iyF0rj1558514269935.jpg b/web/public/imgs/skin/XQE2iyF0rj1558514269935.jpg new file mode 100644 index 00000000..5409067e Binary files /dev/null and b/web/public/imgs/skin/XQE2iyF0rj1558514269935.jpg differ diff --git a/web/public/imgs/skin/XYKqJZuMig1558430904735.jpg b/web/public/imgs/skin/XYKqJZuMig1558430904735.jpg new file mode 100644 index 00000000..113afd9b Binary files /dev/null and b/web/public/imgs/skin/XYKqJZuMig1558430904735.jpg differ diff --git a/web/public/imgs/skin/YP9PoW8pX51558434537301.jpg b/web/public/imgs/skin/YP9PoW8pX51558434537301.jpg new file mode 100644 index 00000000..7596812b Binary files /dev/null and b/web/public/imgs/skin/YP9PoW8pX51558434537301.jpg differ diff --git a/web/public/imgs/skin/gY1JljCow21558434538303.jpg b/web/public/imgs/skin/gY1JljCow21558434538303.jpg new file mode 100644 index 00000000..8f2b3502 Binary files /dev/null and b/web/public/imgs/skin/gY1JljCow21558434538303.jpg differ diff --git a/web/public/imgs/skin/icSlqsr0uZ1558514860875.jpg b/web/public/imgs/skin/icSlqsr0uZ1558514860875.jpg new file mode 100644 index 00000000..47163d78 Binary files /dev/null and b/web/public/imgs/skin/icSlqsr0uZ1558514860875.jpg differ diff --git a/web/public/imgs/skin/j8C2OBP7WK1558514268563.jpg b/web/public/imgs/skin/j8C2OBP7WK1558514268563.jpg new file mode 100644 index 00000000..e6dcb4b8 Binary files /dev/null and b/web/public/imgs/skin/j8C2OBP7WK1558514268563.jpg differ diff --git a/web/public/imgs/skin/lE6PSclCcU1558434536703.jpg b/web/public/imgs/skin/lE6PSclCcU1558434536703.jpg new file mode 100644 index 00000000..1041505f Binary files /dev/null and b/web/public/imgs/skin/lE6PSclCcU1558434536703.jpg differ diff --git a/web/public/imgs/skin/oOjHPbABdd1558434538864.jpg b/web/public/imgs/skin/oOjHPbABdd1558434538864.jpg new file mode 100644 index 00000000..c268435a Binary files /dev/null and b/web/public/imgs/skin/oOjHPbABdd1558434538864.jpg differ diff --git a/web/public/imgs/skin/oVTedX9V4s1558430527671.jpg b/web/public/imgs/skin/oVTedX9V4s1558430527671.jpg new file mode 100644 index 00000000..7a6b39b9 Binary files /dev/null and b/web/public/imgs/skin/oVTedX9V4s1558430527671.jpg differ diff --git a/web/public/imgs/skin/q3uJoQhYsR1558514268877.jpg b/web/public/imgs/skin/q3uJoQhYsR1558514268877.jpg new file mode 100644 index 00000000..31edc847 Binary files /dev/null and b/web/public/imgs/skin/q3uJoQhYsR1558514268877.jpg differ diff --git a/web/public/imgs/skin/sqYig4AcWr1558430525663.jpg b/web/public/imgs/skin/sqYig4AcWr1558430525663.jpg new file mode 100644 index 00000000..6e17138c Binary files /dev/null and b/web/public/imgs/skin/sqYig4AcWr1558430525663.jpg differ diff --git a/web/public/imgs/skin/ujpUoWqhw31558430220124.jpg b/web/public/imgs/skin/ujpUoWqhw31558430220124.jpg new file mode 100644 index 00000000..9dc804af Binary files /dev/null and b/web/public/imgs/skin/ujpUoWqhw31558430220124.jpg differ diff --git a/web/public/imgs/skin/ykWLFV0QWj1558514861444.jpg b/web/public/imgs/skin/ykWLFV0QWj1558514861444.jpg new file mode 100644 index 00000000..dd0064d6 Binary files /dev/null and b/web/public/imgs/skin/ykWLFV0QWj1558514861444.jpg differ diff --git a/web/public/imgs/skin/zUtDv378bg1558434538351.jpg b/web/public/imgs/skin/zUtDv378bg1558434538351.jpg new file mode 100644 index 00000000..ced2f77b Binary files /dev/null and b/web/public/imgs/skin/zUtDv378bg1558434538351.jpg differ diff --git a/web/public/management.html b/web/public/management.html new file mode 100644 index 00000000..86628615 --- /dev/null +++ b/web/public/management.html @@ -0,0 +1,17 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
+ + + diff --git a/web/public/render.html b/web/public/render.html new file mode 100644 index 00000000..afd01ecd --- /dev/null +++ b/web/public/render.html @@ -0,0 +1,53 @@ + + + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + +
+ + + \ No newline at end of file diff --git a/web/src/common/Editor/EditorV2.vue b/web/src/common/Editor/EditorV2.vue new file mode 100644 index 00000000..0f7ed8a9 --- /dev/null +++ b/web/src/common/Editor/EditorV2.vue @@ -0,0 +1,68 @@ + + + diff --git a/web/src/common/Editor/ReadOnly.vue b/web/src/common/Editor/ReadOnly.vue new file mode 100644 index 00000000..3f2a2b19 --- /dev/null +++ b/web/src/common/Editor/ReadOnly.vue @@ -0,0 +1,90 @@ + + + diff --git a/web/src/common/Editor/RichEditor.vue b/web/src/common/Editor/RichEditor.vue new file mode 100644 index 00000000..44e2b578 --- /dev/null +++ b/web/src/common/Editor/RichEditor.vue @@ -0,0 +1,140 @@ + + + + diff --git a/web/src/common/xss.js b/web/src/common/xss.js new file mode 100644 index 00000000..f0c03ea1 --- /dev/null +++ b/web/src/common/xss.js @@ -0,0 +1,62 @@ +import xss from 'xss'; + +const myxss = new xss.FilterXSS({ + onIgnoreTagAttr(tag, name, value) { + if (name === 'style' || name === 'class') { + return `${name}="${value}"`; + } + return undefined; + }, + onIgnoreTag(tag, html) { + // 过滤为空,否则不过滤为空 + var re1 = new RegExp('<.+?>', 'g'); + if (re1.test(html)) { + return ''; + } else { + return html; + } + }, +}); + +const isImg = (html) => { + html = html + ''; + return html.indexOf(' -1; +}; +const isVideo = (html) => { + html = html + ''; + return html.indexOf(' -1; +}; + +export const cleanRichText = (text) => { + if (!text) { + return ''; + } + const html = transformHtmlTag(text); + const content = html.replace(/<[^<>]+>/g, '').replace(/ /g, ''); + if (content) return content; + + if (isImg(html)) return '图片'; + if (isVideo(html)) return '视频'; + return '文本'; +}; +export function escapeHtml(html) { + return html.replace(//g, '>'); +} +export const transformHtmlTag = (html) => { + if (!html) return ''; + if (typeof html !== 'string') return html + ''; + return html + .replace(html ? /&(?!#?\w+;)/g : /&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/\\\n/g, '\\n'); + //.replace(/ /g, "") +}; + +const filterXSSClone = myxss.process.bind(myxss); + +export const filterXSS = (html) => filterXSSClone(transformHtmlTag(html)); + +export const escapeFilterXSS = (html) => escapeHtml(filterXSS(html)); diff --git a/web/src/management/App.vue b/web/src/management/App.vue new file mode 100644 index 00000000..879ef969 --- /dev/null +++ b/web/src/management/App.vue @@ -0,0 +1,38 @@ + + + diff --git a/web/src/management/api/analysis.js b/web/src/management/api/analysis.js new file mode 100644 index 00000000..c8e6d16b --- /dev/null +++ b/web/src/management/api/analysis.js @@ -0,0 +1,10 @@ +import axios from './base'; + +export const getRecycleList = (data) => { + return axios.get('/surveyManage/data', { + params: { + pageSize: 10, + ...data, + }, + }); +}; diff --git a/web/src/management/api/base.js b/web/src/management/api/base.js new file mode 100644 index 00000000..cd0e2a73 --- /dev/null +++ b/web/src/management/api/base.js @@ -0,0 +1,44 @@ +import axios from 'axios'; +import store from '@/management/store/index'; +import router from '@/management/router/index'; +import _get from 'lodash/get'; + +const instance = axios.create({ + baseURL: '/api', + timeout: 3000, +}); + +instance.interceptors.response.use((response) => { + if (response.status !== 200) { + throw new Error('http请求出错'); + } + const res = response.data; + if (res.code === 403) { + router.replace({ + name: 'login', + }); + return res; + } else { + return res; + } +}); + +instance.interceptors.request.use((config) => { + const hasLogined = _get(store, 'state.user.hasLogined'); + const token = _get(store, 'state.user.userInfo.token'); + if (hasLogined && token) { + if (!config.headers) { + config.headers = {}; + } + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +export default instance; + +export const CODE_MAP = { + SUCCESS: 200, + ERROR: 500, + NOTAUTH: 403, +}; diff --git a/web/src/management/api/skin.js b/web/src/management/api/skin.js new file mode 100644 index 00000000..9f658ff3 --- /dev/null +++ b/web/src/management/api/skin.js @@ -0,0 +1,5 @@ +import axios from './base'; + +export const getBannerData = () => { + return axios.get('/surveyManage/getBannerData'); +}; diff --git a/web/src/management/api/survey.js b/web/src/management/api/survey.js new file mode 100644 index 00000000..feb7fd12 --- /dev/null +++ b/web/src/management/api/survey.js @@ -0,0 +1,51 @@ +import axios from './base'; + +export const getSurveyList = (curPage) => { + return axios.get('/surveyManage/list', { + params: { + pageSize: 10, + curPage, + }, + }); +}; + +export const getSurveyById = (id) => { + return axios.get('/surveyManage/get', { + params: { + surveyId: id, + }, + }); +}; + +export const saveSurvey = ({ surveyId, configData }) => { + return axios.post('/surveyManage/saveConf', { surveyId, configData }); +}; + +export const publishSurvey = ({ surveyId }) => { + return axios.post('/surveyManage/publish', { + surveyId, + }); +}; + +export const createSurvey = (data) => { + return axios.post('/surveyManage/add', data); +}; + +export const getSurveyHistory = ({ surveyId, historyType }) => { + return axios.get('/surveyManage/getHistoryList', { + params: { + surveyId, + historyType, + }, + }); +}; + +export const deleteSurvey = (surveyId) => { + return axios.post('/surveyManage/delete', { + surveyId, + }); +}; + +export const updateSurvey = (data) => { + return axios.post('/surveyManage/update', data); +}; diff --git a/web/src/management/api/user.js b/web/src/management/api/user.js new file mode 100644 index 00000000..e2dfd7c1 --- /dev/null +++ b/web/src/management/api/user.js @@ -0,0 +1,15 @@ +import axios from './base'; + +export const register = ({ username, password }) => { + return axios.post('/user/register', { + username, + password, + }); +}; + +export const login = ({ username, password }) => { + return axios.post('/user/login', { + username, + password, + }); +}; diff --git a/web/src/management/components/empty.vue b/web/src/management/components/empty.vue new file mode 100644 index 00000000..807c8ca8 --- /dev/null +++ b/web/src/management/components/empty.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/web/src/management/components/leftMenu.vue b/web/src/management/components/leftMenu.vue new file mode 100644 index 00000000..88e51ce5 --- /dev/null +++ b/web/src/management/components/leftMenu.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/web/src/management/components/logo.vue b/web/src/management/components/logo.vue new file mode 100644 index 00000000..dbbc2799 --- /dev/null +++ b/web/src/management/components/logo.vue @@ -0,0 +1,34 @@ + + + diff --git a/web/src/management/config/questionConfig.js b/web/src/management/config/questionConfig.js new file mode 100644 index 00000000..b949b653 --- /dev/null +++ b/web/src/management/config/questionConfig.js @@ -0,0 +1,73 @@ +// 题型基础字段模板 +export const defaultQuestionConfig = { + // 题目id + field: '', + // 显示序号 + showIndex: true, + // 显示类型 + showType: true, + // 显示分割线 + showSpliter: true, + // 题目类型 + type: '', + placeholderDesc: '', + sLimit: 0, + mhLimit: 0, + title: '', + placeholder: '', + valid: '', + isRequired: true, + randomSort: false, + showLeftNum: true, + innerRandom: false, + checked: false, + selectType: 'radio', + sortWay: 'v', + noNps: '', + minNum: '', + maxNum: '', + starStyle: 'star', + starMin: 1, + starMax: 5, + // 分值对应的开关和输入框配置,因为不是固定从0开始,用对象比较合适 + rangeConfig: {}, + // 选项 + options: [ + { + text: '选项1', + others: false, + othersKey: '', + placeholderDesc: '', + }, + { + text: '选项2', + others: false, + othersKey: '', + placeholderDesc: '', + }, + ], + star: 5, + optionOrigin: '', + originType: 'selected', + matrixOptionsRely: '', + numberRange: { + min: { + placeholder: '0', + value: 0, + }, + max: { + placeholder: '1000', + value: 1000, + }, + }, + textRange: { + min: { + placeholder: '0', + value: 0, + }, + max: { + placeholder: '500', + value: 500, + }, + }, +}; diff --git a/web/src/management/config/questionMenuConfig.js b/web/src/management/config/questionMenuConfig.js new file mode 100644 index 00000000..5c459e30 --- /dev/null +++ b/web/src/management/config/questionMenuConfig.js @@ -0,0 +1,73 @@ +const menuItems = { + text: { + type: 'text', + snapshot: '/imgs/question-type-snapshot/iL84te6xxU1657702189333.png', + path: 'InputModule', + icon: 'tixing-danhangshuru', + title: '单行输入框', + }, + textarea: { + type: 'textarea', + snapshot: '/imgs/question-type-snapshot/11iAo3ca0u1657702225416.png', + path: 'TextareaModule', + icon: 'tixing-duohangshuru', + title: '多行输入框', + }, + radio: { + type: 'radio', + snapshot: '/imgs/question-type-snapshot/TgeRDfURJZ1657702220602.png', + icon: 'tixing-danxuan', + path: 'RadioModule', + title: '单项选择', + }, + checkbox: { + type: 'checkbox', + path: 'CheckboxModule', + snapshot: '/imgs/question-type-snapshot/Md2YmzBBpV1657702223744.png', + icon: 'tixing-duoxuan', + title: '多项选择', + }, + 'binary-choice': { + type: 'binary-choice', + snapshot: '/imgs/question-type-snapshot/blW8U1ckzd1657702223023.png', + path: 'BinaryChoiceModule', + icon: 'tixing-panduanti', + title: '判断题', + }, + 'radio-star': { + type: 'radio-star', + snapshot: '/imgs/question-type-snapshot/7CU6tn4XqT1657702221208.png', + path: 'StarModule', + icon: 'tixing-pingfen', + title: '评分', + }, + vote: { + type: 'vote', + path: 'VoteModule', + snapshot: '/imgs/question-type-snapshot/nGTscsZlwn1657702222857.png', + icon: 'tixing-toupiao', + title: '投票', + }, +}; + +const menuGroup = [ + { + title: '输入类题型', + questionList: ['text', 'textarea'], + }, + { + title: '选择类题型', + questionList: ['radio', 'checkbox', 'binary-choice', 'radio-star', 'vote'], + }, +]; + +const menu = menuGroup.map((group) => { + group.questionList = group.questionList.map( + (question) => menuItems[question] + ); + return group; +}); + +export const questionTypeList = Object.values(menuItems); + +export default menu; diff --git a/web/src/management/config/setterConfig/bannerConfig.js b/web/src/management/config/setterConfig/bannerConfig.js new file mode 100644 index 00000000..e6b6cc7d --- /dev/null +++ b/web/src/management/config/setterConfig/bannerConfig.js @@ -0,0 +1,55 @@ +export default [ + { + label: '头图配置(默认尺寸:750*260)', + type: 'Customed', + key: 'bannerConfig', + labelStyle: { + fontWeight: 'bold', + }, + content: [ + { + label: '顶部图片地址', + type: 'Input', + key: 'bannerConfig.bgImage', + direction: 'horizon', + }, + { + label: '顶部视频地址', + type: 'Input', + key: 'bannerConfig.videoLink', + direction: 'horizon', + }, + { + label: '视频海报地址', + type: 'Input', + key: 'bannerConfig.posterImg', + direction: 'horizon', + }, + ], + }, + { + label: '头图跳转', + type: 'Customed', + key: 'bannerConfig-Jump', + labelStyle: { + fontWeight: 'bold', + }, + content: [ + { + label: '图片支持点击', + type: 'CustomedSwitch', + direction: 'space_between', + key: 'bannerConfig.bgImageAllowJump', + }, + { + label: '跳转链接', + type: 'Input', + direction: 'horizon', + key: 'bannerConfig.bgImageJumpLink', + relyFunc: (data) => { + return !!data?.bannerConfig?.bgImageAllowJump; + }, + }, + ], + }, +]; diff --git a/web/src/management/config/setterConfig/logoConfig.js b/web/src/management/config/setterConfig/logoConfig.js new file mode 100644 index 00000000..2fe8c0eb --- /dev/null +++ b/web/src/management/config/setterConfig/logoConfig.js @@ -0,0 +1,20 @@ +export default [ + { + label: '自定义Logo', + type: 'Input', + key: 'logoImage', + tip: '默认尺寸200px*50px', + labelStyle: { + fontWeight: 'bold', + }, + }, + { + label: 'Logo大小', + type: 'InputPercent', + key: 'logoImageWidth', + tip: '填写宽度百分比,例如30%', + labelStyle: { + fontWeight: 'bold', + }, + }, +]; diff --git a/web/src/management/config/setterConfig/submitConfig.js b/web/src/management/config/setterConfig/submitConfig.js new file mode 100644 index 00000000..2a11a2bf --- /dev/null +++ b/web/src/management/config/setterConfig/submitConfig.js @@ -0,0 +1,71 @@ +export default [ + { + label: '提交按钮文案', + type: 'Input', + key: 'submitTitle', + placeholder: '提交', + value: '', + labelStyle: { + fontWeight: 'bold', + }, + }, + { + label: '提交确认弹窗', + type: 'Customed', + key: 'confirmAgain', + labelStyle: { + fontWeight: 'bold', + }, + content: [ + { + label: '是否配置该项', + type: 'CustomedSwitch', + key: 'confirmAgain.is_again', + direction: 'horizon', + value: true, + }, + { + label: '二次确认文案', + type: 'Input', + key: 'confirmAgain.again_text', + direction: 'horizon', + placeholder: '确认要提交吗?', + value: '确认要提交吗?', + }, + ], + }, + { + label: '提交文案配置', + type: 'Customed', + key: 'msgContent', + labelStyle: { + fontWeight: 'bold', + }, + content: [ + { + label: '已提交', + type: 'Input', + key: 'msgContent.msg_9002', + placeholder: '请勿多次提交!', + value: '请勿多次提交!', + direction: 'horizon', + }, + { + label: '提交结束', + type: 'Input', + key: 'msgContent.msg_9003', + placeholder: '您来晚了,已经满额!', + value: '您来晚了,已经满额!', + direction: 'horizon', + }, + { + label: '其他提交失败', + type: 'Input', + key: 'msgContent.msg_9004', + placeholder: '提交失败!', + value: '提交失败!', + direction: 'horizon', + }, + ], + }, +]; diff --git a/web/src/management/main.js b/web/src/management/main.js new file mode 100644 index 00000000..0ab60b21 --- /dev/null +++ b/web/src/management/main.js @@ -0,0 +1,36 @@ +import Vue from 'vue'; +import App from './App.vue'; +import router from './router'; +import store from './store'; +import ElementUI from 'element-ui'; +import './styles/element-variables.scss'; +import { filterXSS, cleanRichText } from '@/common/xss'; + +Vue.config.productionTip = false; +Vue.use(ElementUI); + +const safeHtml = function (el, binding) { + const res = filterXSS(binding.value); + el.innerHTML = res; +}; + +const plainText = function (el, binding) { + const text = cleanRichText(binding.value); + el.innerText = text; +}; + +Vue.directive('safe-html', { + inserted: safeHtml, + componentUpdated: safeHtml, +}); + +Vue.directive('plain-text', { + inserted: plainText, + componentUpdated: plainText, +}); + +new Vue({ + router, + store, + render: (h) => h(App), +}).$mount('#app'); diff --git a/web/src/management/pages/analysis/components/table.vue b/web/src/management/pages/analysis/components/table.vue new file mode 100644 index 00000000..ae09397d --- /dev/null +++ b/web/src/management/pages/analysis/components/table.vue @@ -0,0 +1,103 @@ + + + diff --git a/web/src/management/pages/analysis/index.vue b/web/src/management/pages/analysis/index.vue new file mode 100644 index 00000000..4afd88ef --- /dev/null +++ b/web/src/management/pages/analysis/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/web/src/management/pages/create/components/createForm.vue b/web/src/management/pages/create/components/createForm.vue new file mode 100644 index 00000000..c655294f --- /dev/null +++ b/web/src/management/pages/create/components/createForm.vue @@ -0,0 +1,162 @@ + + + diff --git a/web/src/management/pages/create/components/navHeader.vue b/web/src/management/pages/create/components/navHeader.vue new file mode 100644 index 00000000..13fd9ea0 --- /dev/null +++ b/web/src/management/pages/create/components/navHeader.vue @@ -0,0 +1,83 @@ + + + diff --git a/web/src/management/pages/create/components/typeList.vue b/web/src/management/pages/create/components/typeList.vue new file mode 100644 index 00000000..160cf451 --- /dev/null +++ b/web/src/management/pages/create/components/typeList.vue @@ -0,0 +1,139 @@ + + + diff --git a/web/src/management/pages/create/index.vue b/web/src/management/pages/create/index.vue new file mode 100644 index 00000000..36a2784b --- /dev/null +++ b/web/src/management/pages/create/index.vue @@ -0,0 +1,51 @@ + + + diff --git a/web/src/management/pages/create/types.js b/web/src/management/pages/create/types.js new file mode 100644 index 00000000..24294401 --- /dev/null +++ b/web/src/management/pages/create/types.js @@ -0,0 +1,26 @@ +export const SURVEY_TYPE_LIST = [ + { + type: 'normal', + title: '基础调查', + img: '/imgs/create/normal-icon.png', + desc: '市场调研 / 用户分析 / 产品测评 / 需求调研', + }, + // { + // type: 'nps', + // title: 'NPS评分', + // img: '/imgs/create/nps-icon.png', + // desc: '司机评分 / 服务评价 / 满意评价 / 推荐指数', + // }, + { + type: 'vote', + title: '投票评选', + img: '/imgs/create/vote-icon.png', + desc: '才艺比赛 / 优秀员工 / 最佳人气 / 投票选举', + }, + { + type: 'register', + title: '在线报名', + img: '/imgs/create/register-icon.png', + desc: '活动报名 / 会议报名', + }, +]; diff --git a/web/src/management/pages/edit/components/commonTemplate.vue b/web/src/management/pages/edit/components/commonTemplate.vue new file mode 100644 index 00000000..03654232 --- /dev/null +++ b/web/src/management/pages/edit/components/commonTemplate.vue @@ -0,0 +1,62 @@ + + + diff --git a/web/src/management/pages/edit/components/navbar.vue b/web/src/management/pages/edit/components/navbar.vue new file mode 100644 index 00000000..e908093c --- /dev/null +++ b/web/src/management/pages/edit/components/navbar.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/web/src/management/pages/edit/index.vue b/web/src/management/pages/edit/index.vue new file mode 100644 index 00000000..b6060730 --- /dev/null +++ b/web/src/management/pages/edit/index.vue @@ -0,0 +1,64 @@ + + + + diff --git a/web/src/management/pages/edit/modules/contentModule/buildData.js b/web/src/management/pages/edit/modules/contentModule/buildData.js new file mode 100644 index 00000000..dd7fb3f6 --- /dev/null +++ b/web/src/management/pages/edit/modules/contentModule/buildData.js @@ -0,0 +1,23 @@ +import _pick from 'lodash/pick'; +import _get from 'lodash/get'; + +// 生成需要保存到接口的数据 +export default function (schema) { + const surveyId = _get(schema, 'metaData._id'); + const configData = _pick(schema, [ + 'bannerConf', + 'baseConf', + 'bottomConf', + 'skinConf', + 'submitConf', + 'questionDataList', + ]); + configData.dataConf = { + dataList: configData.questionDataList, + }; + delete configData.questionDataList; + return { + surveyId, + configData, + }; +} diff --git a/web/src/management/pages/edit/modules/contentModule/history.vue b/web/src/management/pages/edit/modules/contentModule/history.vue new file mode 100644 index 00000000..6a5e841e --- /dev/null +++ b/web/src/management/pages/edit/modules/contentModule/history.vue @@ -0,0 +1,118 @@ + + + diff --git a/web/src/management/pages/edit/modules/contentModule/publish.vue b/web/src/management/pages/edit/modules/contentModule/publish.vue new file mode 100644 index 00000000..f03bd013 --- /dev/null +++ b/web/src/management/pages/edit/modules/contentModule/publish.vue @@ -0,0 +1,72 @@ + + + diff --git a/web/src/management/pages/edit/modules/contentModule/save.vue b/web/src/management/pages/edit/modules/contentModule/save.vue new file mode 100644 index 00000000..ce9621e7 --- /dev/null +++ b/web/src/management/pages/edit/modules/contentModule/save.vue @@ -0,0 +1,175 @@ + + + diff --git a/web/src/management/pages/edit/modules/generalModule/back.vue b/web/src/management/pages/edit/modules/generalModule/back.vue new file mode 100644 index 00000000..578e5034 --- /dev/null +++ b/web/src/management/pages/edit/modules/generalModule/back.vue @@ -0,0 +1,27 @@ + + + diff --git a/web/src/management/pages/edit/modules/generalModule/pageNav.vue b/web/src/management/pages/edit/modules/generalModule/pageNav.vue new file mode 100644 index 00000000..b1749a53 --- /dev/null +++ b/web/src/management/pages/edit/modules/generalModule/pageNav.vue @@ -0,0 +1,78 @@ + + + diff --git a/web/src/management/pages/edit/modules/generalModule/pageTitle.vue b/web/src/management/pages/edit/modules/generalModule/pageTitle.vue new file mode 100644 index 00000000..f8f7f3df --- /dev/null +++ b/web/src/management/pages/edit/modules/generalModule/pageTitle.vue @@ -0,0 +1,17 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/catalogPanel.vue b/web/src/management/pages/edit/modules/questionModule/catalogPanel.vue new file mode 100644 index 00000000..de4bd201 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/catalogPanel.vue @@ -0,0 +1,45 @@ + + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/banner.vue b/web/src/management/pages/edit/modules/questionModule/components/banner.vue new file mode 100644 index 00000000..f35cb1ca --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/banner.vue @@ -0,0 +1,118 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/bannerList.vue b/web/src/management/pages/edit/modules/questionModule/components/bannerList.vue new file mode 100644 index 00000000..6166126a --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/bannerList.vue @@ -0,0 +1,75 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/catalog.vue b/web/src/management/pages/edit/modules/questionModule/components/catalog.vue new file mode 100644 index 00000000..06d48780 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/catalog.vue @@ -0,0 +1,82 @@ + + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/catalogItem.vue b/web/src/management/pages/edit/modules/questionModule/components/catalogItem.vue new file mode 100644 index 00000000..a84d3004 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/catalogItem.vue @@ -0,0 +1,76 @@ + + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/logo.vue b/web/src/management/pages/edit/modules/questionModule/components/logo.vue new file mode 100644 index 00000000..fddd272b --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/logo.vue @@ -0,0 +1,73 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/mainTitle.vue b/web/src/management/pages/edit/modules/questionModule/components/mainTitle.vue new file mode 100644 index 00000000..5caaa1ac --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/mainTitle.vue @@ -0,0 +1,69 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/materialGroup.vue b/web/src/management/pages/edit/modules/questionModule/components/materialGroup.vue new file mode 100644 index 00000000..677ebe67 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/materialGroup.vue @@ -0,0 +1,121 @@ + diff --git a/web/src/management/pages/edit/modules/questionModule/components/questionWrapper.vue b/web/src/management/pages/edit/modules/questionModule/components/questionWrapper.vue new file mode 100644 index 00000000..2d45f39e --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/questionWrapper.vue @@ -0,0 +1,331 @@ + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/setterField.vue b/web/src/management/pages/edit/modules/questionModule/components/setterField.vue new file mode 100644 index 00000000..95f0c0d4 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/setterField.vue @@ -0,0 +1,175 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/submit.vue b/web/src/management/pages/edit/modules/questionModule/components/submit.vue new file mode 100644 index 00000000..bddecd73 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/submit.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/src/management/pages/edit/modules/questionModule/components/typeList.vue b/web/src/management/pages/edit/modules/questionModule/components/typeList.vue new file mode 100644 index 00000000..3a27927c --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/components/typeList.vue @@ -0,0 +1,162 @@ + + + + + + diff --git a/web/src/management/pages/edit/modules/questionModule/previewPanel.vue b/web/src/management/pages/edit/modules/questionModule/previewPanel.vue new file mode 100644 index 00000000..6d6c360f --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/previewPanel.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/web/src/management/pages/edit/modules/questionModule/setterPanel.vue b/web/src/management/pages/edit/modules/questionModule/setterPanel.vue new file mode 100644 index 00000000..675e8940 --- /dev/null +++ b/web/src/management/pages/edit/modules/questionModule/setterPanel.vue @@ -0,0 +1,103 @@ + + + + diff --git a/web/src/management/pages/edit/modules/settingModule/components/overTime.vue b/web/src/management/pages/edit/modules/settingModule/components/overTime.vue new file mode 100755 index 00000000..b48bb570 --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/components/overTime.vue @@ -0,0 +1,42 @@ + + + diff --git a/web/src/management/pages/edit/modules/settingModule/components/success.vue b/web/src/management/pages/edit/modules/settingModule/components/success.vue new file mode 100644 index 00000000..538dd95b --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/components/success.vue @@ -0,0 +1,64 @@ + + + diff --git a/web/src/management/pages/edit/modules/settingModule/config/baseConfig.js b/web/src/management/pages/edit/modules/settingModule/config/baseConfig.js new file mode 100644 index 00000000..726b370f --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/config/baseConfig.js @@ -0,0 +1,12 @@ +export default [ + { + title: '时间配置', + key: 'timeConfig', + formList: ['base_effectTime', 'limit_answerTime'], + }, + { + title: '提交限制', + key: 'limitConfig', + formList: ['limit_tLimit'], + }, +]; diff --git a/web/src/management/pages/edit/modules/settingModule/config/baseFormConfig.js b/web/src/management/pages/edit/modules/settingModule/config/baseFormConfig.js new file mode 100644 index 00000000..71690d05 --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/config/baseFormConfig.js @@ -0,0 +1,82 @@ +// 问卷设置,定义了字段和对应的设置器 +export default { + base_effectTime: { + keys: ['baseConf.begTime', 'baseConf.endTime'], + label: '答题有效期', + type: 'QuestionTime', + placeholder: 'yyyy-MM-dd hh:mm:ss', + direction: 'horizon', + }, + // base_showVote: { + // key: 'baseConf.showVoteProcess', + // label: '投票配置', + // type: 'Select', + // direction: 'horizon', + // tip: '是否实时展示投票进度', + // placement: 'top', + // options: [ + // { + // label: '实时展示投票进度', + // value: 'allow', + // }, + // { + // label: '提交后才可以查看进度', + // value: 'notallow', + // }, + // { + // label: '不展示投票进度', + // value: 'never', + // }, + // ], + // }, + // base_shortestTime: { + // key: 'baseConf.shortestTime', + // label: '最短答题时长(分钟)', + // type: 'InputNumber', + // direction: 'horizon', + // tip: '问卷仅可在所设置的时间之后才能进行提交,0为无限制', + // tipShow: true, + // placement: 'top', + // }, + limit_tLimit: { + key: 'baseConf.tLimit', + label: '问卷回收总数', + type: 'InputNumber', + direction: 'horizon', + tip: '0为无限制,此功能用于限制该问卷总提交的数据量。当数据量达到限额时,该问卷将不能继续提交', + tipShow: true, + placement: 'top', + min: 0, + }, + limit_answerTime: { + keys: ['baseConf.answerBegTime', 'baseConf.answerEndTime'], + label: '答题时段', + tip: '问卷仅在指定时间段内可填写', + type: 'QuestionTimeHour', + direction: 'horizon', + placement: 'top', + }, + // skin_skinColor: { + // key: 'skinConf.skinColor', + // label: '页面主题颜色', + // type: 'Select', + // direction: 'horizon', + // options: [ + // { + // label: '橘色主题', + // value: '#ff8a01', + // }, + // { + // label: '深灰蓝主题', + // value: '#4a4c5b', + // }, + // ], + // }, + // skin_inputBgColor: { + // key: 'skinConf.inputBgColor', + // label: '输入框底色', + // type: 'ColorInput', + // direction: 'horizon', + // maxlength: 6, + // }, +}; diff --git a/web/src/management/pages/edit/modules/settingModule/config/statusConfig.js b/web/src/management/pages/edit/modules/settingModule/config/statusConfig.js new file mode 100644 index 00000000..07b61d0b --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/config/statusConfig.js @@ -0,0 +1,26 @@ +export default { + Success: [ + { + label: '提示文案', + type: 'RichText', + key: 'msgContent.msg_200', + placeholder: '提交成功', + value: '提交成功', + labelStyle: { + 'font-weight': 'bold', + }, + }, + ], + OverTime: [ + { + label: '提示文案', + type: 'RichText', + key: 'msgContent.msg_9001', + placeholder: '问卷已过期', + value: '问卷已过期', + labelStyle: { + 'font-weight': 'bold', + }, + }, + ], +}; diff --git a/web/src/management/pages/edit/modules/settingModule/enum.js b/web/src/management/pages/edit/modules/settingModule/enum.js new file mode 100644 index 00000000..0c8b418b --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/enum.js @@ -0,0 +1,4 @@ +export const EDIT_STATUS_MAP = { + SUCCESS: 'Success', + OVERTIME: 'OverTime', +}; diff --git a/web/src/management/pages/edit/modules/settingModule/resultCatalog.vue b/web/src/management/pages/edit/modules/settingModule/resultCatalog.vue new file mode 100644 index 00000000..696341da --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/resultCatalog.vue @@ -0,0 +1,88 @@ + + + diff --git a/web/src/management/pages/edit/modules/settingModule/resultPreview.vue b/web/src/management/pages/edit/modules/settingModule/resultPreview.vue new file mode 100644 index 00000000..55808cf1 --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/resultPreview.vue @@ -0,0 +1,63 @@ + + + diff --git a/web/src/management/pages/edit/modules/settingModule/resultSetter.vue b/web/src/management/pages/edit/modules/settingModule/resultSetter.vue new file mode 100644 index 00000000..198ff4d8 --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/resultSetter.vue @@ -0,0 +1,156 @@ + + + diff --git a/web/src/management/pages/edit/modules/settingModule/setting.vue b/web/src/management/pages/edit/modules/settingModule/setting.vue new file mode 100644 index 00000000..465d50ff --- /dev/null +++ b/web/src/management/pages/edit/modules/settingModule/setting.vue @@ -0,0 +1,203 @@ + + + diff --git a/web/src/management/pages/edit/pages/edit.vue b/web/src/management/pages/edit/pages/edit.vue new file mode 100644 index 00000000..f7ac519d --- /dev/null +++ b/web/src/management/pages/edit/pages/edit.vue @@ -0,0 +1,28 @@ + + + diff --git a/web/src/management/pages/edit/pages/resultConfig.vue b/web/src/management/pages/edit/pages/resultConfig.vue new file mode 100644 index 00000000..c8dca99a --- /dev/null +++ b/web/src/management/pages/edit/pages/resultConfig.vue @@ -0,0 +1,24 @@ + + + diff --git a/web/src/management/pages/edit/pages/setting.vue b/web/src/management/pages/edit/pages/setting.vue new file mode 100644 index 00000000..c38529e4 --- /dev/null +++ b/web/src/management/pages/edit/pages/setting.vue @@ -0,0 +1,20 @@ + + + diff --git a/web/src/management/pages/list/components/baseList.vue b/web/src/management/pages/list/components/baseList.vue new file mode 100644 index 00000000..3d83e354 --- /dev/null +++ b/web/src/management/pages/list/components/baseList.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/web/src/management/pages/list/components/modify.vue b/web/src/management/pages/list/components/modify.vue new file mode 100644 index 00000000..269596b2 --- /dev/null +++ b/web/src/management/pages/list/components/modify.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/web/src/management/pages/list/components/tag.vue b/web/src/management/pages/list/components/tag.vue new file mode 100644 index 00000000..74668e2d --- /dev/null +++ b/web/src/management/pages/list/components/tag.vue @@ -0,0 +1,50 @@ + + + diff --git a/web/src/management/pages/list/components/tool.vue b/web/src/management/pages/list/components/tool.vue new file mode 100644 index 00000000..aec475cd --- /dev/null +++ b/web/src/management/pages/list/components/tool.vue @@ -0,0 +1,48 @@ + + + diff --git a/web/src/management/pages/list/components/toolBar.vue b/web/src/management/pages/list/components/toolBar.vue new file mode 100644 index 00000000..e41b36a2 --- /dev/null +++ b/web/src/management/pages/list/components/toolBar.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/web/src/management/pages/list/config/index.js b/web/src/management/pages/list/config/index.js new file mode 100644 index 00000000..c0b9cb1c --- /dev/null +++ b/web/src/management/pages/list/config/index.js @@ -0,0 +1,51 @@ +export const type = { + normal: '调查问卷', + vote: '投票评选', + nps: 'NPS评分', + register: '在线报名', +}; + +export const thead = { + type: '类型', + title: '标题', + remark: '备注', + state: '状态', + owner: '所有者', + creator: '创建人', + tags: '标签', + updateDate: '时间', + collectCount: '回收数', +}; + +export const fieldConfig = { + type: { + key: 'type', + width: 150, + comp: 'tag', + }, + title: { + key: 'title', + width: 240, + tip: true, + }, + remark: { + key: 'remark', + width: 200, + tip: true, + }, + + creator: { + key: 'creator', + width: 140, + }, + updateDate: { + key: 'updateDate', + minWidth: 200, + }, +}; + +export const noListDataConfig = { + title: '您还没有创建问卷', + desc: '赶快点击右上角立即创建问卷吧!', + img: '/imgs/icons/list-empty.png', +}; diff --git a/web/src/management/pages/list/index.vue b/web/src/management/pages/list/index.vue new file mode 100644 index 00000000..fb30b2a5 --- /dev/null +++ b/web/src/management/pages/list/index.vue @@ -0,0 +1,115 @@ + + + + diff --git a/web/src/management/pages/login/index.vue b/web/src/management/pages/login/index.vue new file mode 100644 index 00000000..3c75ac38 --- /dev/null +++ b/web/src/management/pages/login/index.vue @@ -0,0 +1,173 @@ + + + diff --git a/web/src/management/pages/publishResult/components/QRCode.vue b/web/src/management/pages/publishResult/components/QRCode.vue new file mode 100644 index 00000000..bc62add8 --- /dev/null +++ b/web/src/management/pages/publishResult/components/QRCode.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/web/src/management/pages/publishResult/components/channelRow.vue b/web/src/management/pages/publishResult/components/channelRow.vue new file mode 100644 index 00000000..21f5f533 --- /dev/null +++ b/web/src/management/pages/publishResult/components/channelRow.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/web/src/management/pages/publishResult/index.vue b/web/src/management/pages/publishResult/index.vue new file mode 100644 index 00000000..63e715e6 --- /dev/null +++ b/web/src/management/pages/publishResult/index.vue @@ -0,0 +1,154 @@ + + + + diff --git a/web/src/management/router/index.js b/web/src/management/router/index.js new file mode 100644 index 00000000..e5c15ca4 --- /dev/null +++ b/web/src/management/router/index.js @@ -0,0 +1,117 @@ +import Vue from 'vue'; +import VueRouter from 'vue-router'; + +Vue.use(VueRouter); + +const routes = [ + { + path: '/', + redirect: '/survey', + }, + { + path: '/survey', + name: 'survey', + component: () => import('../pages/list/index.vue'), + meta: { + needLogin: true, + title: '问卷列表', + }, + }, + { + path: '/survey/:id/edit', + name: 'editPage', + meta: { + needLogin: true, + }, + component: () => import('../pages/edit/index.vue'), + children: [ + { + path: '', + name: 'QuestionEditIndex', + meta: { + needLogin: true, + }, + component: () => import('../pages/edit/pages/edit.vue'), + }, + { + path: 'setting', + name: 'QuestionEditSetting', + meta: { + needLogin: true, + }, + component: () => import('../pages/edit/pages/setting.vue'), + }, + { + path: 'resultConfig', + name: 'QuestionEditResultConfig', + meta: { + needLogin: true, + }, + component: () => import('../pages/edit/pages/resultConfig.vue'), + }, + ], + }, + { + path: '/survey/:id/analysis', + name: 'analysisPage', + meta: { + needLogin: true, + }, + component: () => import('../pages/analysis/index.vue'), + }, + { + path: '/survey/:id/publishResult', + name: 'publishResultPage', + meta: { + needLogin: true, + }, + component: () => import('../pages/publishResult/index.vue'), + }, + { + path: '/create', + name: 'create', + meta: { + needLogin: true, + title: '创建问卷', + }, + component: () => import('../pages/create/index.vue'), + }, + { + path: '/login', + name: 'login', + title: '登陆', + component: () => import('../pages/login/index.vue'), + }, +]; + +const router = new VueRouter({ + mode: 'history', + base: '/management', + routes, +}); + +router.beforeEach((to, from, next) => { + const store = router.app.$options.store; + if (!store?.state?.user?.initialized) { + store.dispatch('user/init'); + } + if (to.meta.title) { + document.title = to.meta.title; + } + if (to.meta.needLogin) { + if (store?.state?.user?.hasLogined) { + next(); + } else { + next({ + name: 'login', + query: { + redirect: encodeURIComponent(to.path), + }, + }); + } + } else { + next(); + } +}); + +export default router; diff --git a/web/src/management/store/actions.js b/web/src/management/store/actions.js new file mode 100644 index 00000000..6eb77b8e --- /dev/null +++ b/web/src/management/store/actions.js @@ -0,0 +1,13 @@ +import { getBannerData } from '@/management/api/skin.js'; + +export default { + async getBannerData({ state, commit }) { + if (state.bannerList && state.bannerList.length > 0) { + return + } + const res = await getBannerData(); + if (res.code === 200) { + commit('setBannerList', res.data); + } + }, +}; diff --git a/web/src/management/store/edit/actions.js b/web/src/management/store/edit/actions.js new file mode 100644 index 00000000..2b254805 --- /dev/null +++ b/web/src/management/store/edit/actions.js @@ -0,0 +1,70 @@ +import { getNewField } from '@/management/utils'; +import _cloneDeep from 'lodash/cloneDeep'; +import { getSurveyById } from '@/management/api/survey'; +import _get from 'lodash/get'; + +export default { + init({ state, dispatch }) { + const metaData = _get(state, 'schema.metaData'); + if (!metaData || metaData._id !== state.surveyId) { + dispatch('getSchemaFromRemote'); + } + dispatch('resetState'); + }, + async getSchemaFromRemote({ commit, state }) { + const res = await getSurveyById(state.surveyId); + if (res.code === 200) { + const metaData = res.data.surveyMetaRes; + document.title = metaData.title; + const { + bannerConf, + bottomConf, + skinConf, + baseConf, + submitConf, + dataConf, + } = res.data.surveyConfRes.code; + commit('initSchema', { + metaData, + codeData: { + bannerConf, + bottomConf, + skinConf, + baseConf, + submitConf, + questionDataList: dataConf.dataList, + }, + }); + } else { + throw new Error(res.errmsg || '问卷不存在'); + } + }, + resetState({ commit }) { + commit('setCurrentEditOne', null); + commit('changeStatusPreview', { type: 'Success' }); + }, + // 复制题目到当前题目后 + copyQuestion({ commit, state }, { index }) { + const newQuestion = _cloneDeep(state.schema.questionDataList[index]); + newQuestion.field = getNewField( + state.schema.questionDataList.map((item) => item.field) + ); + commit('addQuestion', { question: newQuestion, index }); + }, + addQuestion({ commit }, { question, index }) { + commit('addQuestion', { question, index }); + commit('updateSchemaUpdateTime', Date.now()); + }, + deleteQuestion({ commit }, { index }) { + commit('deleteQuestion', { index }); + commit('updateSchemaUpdateTime', Date.now()); + }, + moveQuestion({ commit }, { index, range }) { + commit('moveQuestion', { index, range }); + commit('updateSchemaUpdateTime', Date.now()); + }, + changeSchema({ commit }, { key, value }) { + commit('changeSchema', { key, value }); + commit('updateSchemaUpdateTime', Date.now()); + }, +}; diff --git a/web/src/management/store/edit/getters.js b/web/src/management/store/edit/getters.js new file mode 100644 index 00000000..ec83eb93 --- /dev/null +++ b/web/src/management/store/edit/getters.js @@ -0,0 +1,82 @@ +import bannerFormConfig from '@/management/config/setterConfig/bannerConfig'; +import logoFormConfig from '@/management/config/setterConfig/logoConfig'; +import submitFormConfig from '@/management/config/setterConfig/submitConfig'; +import questionLoader from '@/materials/questions/questionLoader'; + +const innerMetaConfig = { + banner: { + title: '规则说明配置', + formConfig: bannerFormConfig, + }, + logo: { + title: 'Logo 配置', + formConfig: logoFormConfig, + }, + submit: { + title: '提交配置', + formConfig: submitFormConfig, + }, +}; + +export default { + moduleConfig(state) { + const currentEditOne = state.currentEditOne; + if (currentEditOne === null) { + return null; + } + + if (currentEditOne === 'banner' || currentEditOne === 'mainTitle') { + return state?.schema?.bannerConf; + } else if (currentEditOne === 'submit') { + return state?.schema?.submitConf; + } else if (currentEditOne === 'logo') { + return state?.schema?.bottomConf; + } else if (!Number.isNaN(currentEditOne)) { + return state?.schema?.questionDataList?.[currentEditOne]; + } else { + return null; + } + }, + formConfigList(state, getters) { + const currentEditOne = state.currentEditOne; + if (currentEditOne === null) { + return null; + } + + return getters?.currentEditMeta?.formConfig || []; + }, + currentEditMeta(state) { + const currentEditOne = state.currentEditOne; + if (currentEditOne === null) { + return null; + } else if (innerMetaConfig[currentEditOne]) { + return innerMetaConfig[currentEditOne]; + } else { + const questionType = + state.schema?.questionDataList?.[currentEditOne]?.type; + return questionLoader.getMeta(questionType); + } + }, + currentEditKey(state) { + const currentEditOne = state.currentEditOne; + if (currentEditOne === null) { + return null; + } + let key = ''; + switch (currentEditOne) { + case 'banner': + case 'mainTitle': + key = 'bannerConf'; + break; + case 'submit': + key = 'submitConf'; + break; + case 'logo': + key = 'bottomConf'; + break; + default: + key = `questionDataList.${currentEditOne}`; + } + return key; + }, +}; diff --git a/web/src/management/store/edit/index.js b/web/src/management/store/edit/index.js new file mode 100644 index 00000000..7ab204c5 --- /dev/null +++ b/web/src/management/store/edit/index.js @@ -0,0 +1,12 @@ +import state from './state'; +import mutations from './mutations'; +import actions from './actions'; +import getters from './getters'; + +export default { + namespaced: true, + state, + actions, + getters, + mutations, +}; diff --git a/web/src/management/store/edit/mutations.js b/web/src/management/store/edit/mutations.js new file mode 100644 index 00000000..c57d82b9 --- /dev/null +++ b/web/src/management/store/edit/mutations.js @@ -0,0 +1,90 @@ +import _set from 'lodash/set'; +import _merge from 'lodash/merge'; + +export default { + setCurrentEditOne(state, data) { + state.currentEditOne = data; + }, + changeStatusPreview(state, { type }) { + state.currentEditStatus = type; + }, + updateSchemaUpdateTime(state) { + state.schemaUpdateTime = Date.now(); + }, + initSchema(state, { metaData, codeData }) { + state.schema.metaData = metaData; + state.schema.bannerConf = _merge( + {}, + state.schema.bannerConf, + codeData.bannerConf + ); + state.schema.bottomConf = _merge( + {}, + state.schema.bottomConf, + codeData.bottomConf + ); + state.schema.skinConf = _merge( + {}, + state.schema.skinConf, + codeData.skinConf + ); + state.schema.baseConf = _merge( + {}, + state.schema.baseConf, + codeData.baseConf + ); + state.schema.submitConf = _merge( + {}, + state.schema.submitConf, + codeData.submitConf + ); + state.schema.questionDataList = codeData.questionDataList || []; + }, + setSurveyId(state, data) { + state.surveyId = data; + }, + addQuestion(state, { question, index }) { + state.schema.questionDataList.splice(index, 0, question); + }, + deleteQuestion(state, { index }) { + state.schema.questionDataList.splice(index, 1); + }, + moveQuestion(state, { index, range }) { + let start, end; + if (range < 0) { + // 向上移动 + start = index + range; + end = index; + } else if (range > 0) { + // 向下移动 + start = index + 1; + end = index + range + 1; + } else { + // 无变化 + return; + } + const currentData = state.schema.questionDataList[index]; + // 新位置和老位置之间所有的题目 + const comparedList = state.schema.questionDataList.slice(start, end); + if (range < 0) { + // 向上移动 + state.schema.questionDataList.splice( + index + range, + 1 - range, + currentData, + ...comparedList + ); + } else if (range > 0) { + // 向下移动 + state.schema.questionDataList.splice( + index, + range + 1, + ...comparedList, + currentData + ); + } + }, + changeSchema(state, { key, value }) { + _set(state.schema, key, value); + }, +}; diff --git a/web/src/management/store/edit/state.js b/web/src/management/store/edit/state.js new file mode 100644 index 00000000..c5d55d5c --- /dev/null +++ b/web/src/management/store/edit/state.js @@ -0,0 +1,50 @@ +export default { + currentEditOne: null, + currentEditStatus: 'Success', + schemaUpdateTime: Date.now(), + surveyId: '', // url上取的surveyId + schema: { + metaData: null, + bannerConf: { + titleConfig: { + mainTitle: '

欢迎填写问卷

', + subTitle: `

为了给您提供更好的服务,希望您能抽出几分钟时间,将您的感受和建议告诉我们,期待您的参与!

`, + applyTitle: '', + }, + bannerConfig: { + bgImage: '', + bgImageAllowJump: false, + bgImageJumpLink: '', + videoLink: '', + postImg: '', + }, + }, + bottomConf: { + logoImage: '', + logoImageWidth: '28%', + }, + skinConf: { + skinColor: '#4a4c5b', + inputBgColor: '#ffffff', + }, + baseConf: { + begTime: '', + endTime: '', + language: 'chinese', + showVoteProcess: 'allow', + tLimit: 0, + answerBegTime: '', + answerEndTime: '', + answerLimitTime: 0, + }, + submitConf: { + submitTitle: '', + msgContent: {}, + confirmAgain: { + is_again: true, + }, + link: '', + }, + questionDataList: [], + }, +}; diff --git a/web/src/management/store/index.js b/web/src/management/store/index.js new file mode 100644 index 00000000..5b6176c3 --- /dev/null +++ b/web/src/management/store/index.js @@ -0,0 +1,21 @@ +import Vue from 'vue'; +import Vuex from 'vuex'; +import edit from './edit'; +import user from './user'; + +import actions from './actions'; +import mutations from './mutations'; +import state from './state'; + +Vue.use(Vuex); + +export default new Vuex.Store({ + state, + getters: {}, + mutations, + actions, + modules: { + edit, + user, + }, +}); diff --git a/web/src/management/store/mutations.js b/web/src/management/store/mutations.js new file mode 100644 index 00000000..33d987c3 --- /dev/null +++ b/web/src/management/store/mutations.js @@ -0,0 +1,5 @@ +export default { + setBannerList(state, data) { + state.bannerList = data; + }, +}; diff --git a/web/src/management/store/state.js b/web/src/management/store/state.js new file mode 100644 index 00000000..e32f38af --- /dev/null +++ b/web/src/management/store/state.js @@ -0,0 +1,3 @@ +export default { + bannerList: [], +}; diff --git a/web/src/management/store/user/index.js b/web/src/management/store/user/index.js new file mode 100644 index 00000000..30b9b285 --- /dev/null +++ b/web/src/management/store/user/index.js @@ -0,0 +1,64 @@ +const USER_INFO_KEY = 'surveyUserInfo'; + +export default { + namespaced: true, + state: { + userInfo: { + token: '', + username: '', + }, + hasLogined: false, + loginTime: null, + initialized: false, + }, + mutations: { + setUserInfo(state, data) { + state.userInfo = data; + }, + setHsLogined(state, data) { + state.hasLogined = data; + }, + setLoginTime(state, data) { + state.loginTime = data; + }, + setInitialized(state, data) { + state.initialized = data; + }, + }, + actions: { + init({ dispatch, commit }) { + const localData = localStorage.getItem(USER_INFO_KEY); + if (localData) { + try { + const { userInfo, loginTime } = JSON.parse(localData); + if (Date.now() - loginTime > 7 * 3600000) { + localStorage.removeItem(USER_INFO_KEY); + } else { + dispatch('login', userInfo); + } + } catch (error) { + console.log(error); + } + } + commit('setInitialized', true); + }, + login({ commit }, data) { + const loginTime = Date.now(); + commit('setUserInfo', data); + commit('setHsLogined', true); + commit('setLoginTime', loginTime); + localStorage.setItem( + USER_INFO_KEY, + JSON.stringify({ + userInfo: data, + loginTime: loginTime, + }) + ); + }, + logout({ commit }) { + commit('setUserInfo', null); + commit('setHsLogined', false); + localStorage.removeItem(USER_INFO_KEY); + }, + }, +}; diff --git a/web/src/management/styles/edit-btn.scss b/web/src/management/styles/edit-btn.scss new file mode 100644 index 00000000..138b8f0b --- /dev/null +++ b/web/src/management/styles/edit-btn.scss @@ -0,0 +1,18 @@ +.btn { + display: flex; + flex-direction: column; + width: 50px; + height: 100%; + align-items: center; + justify-content: center; + color: #4a4c5b; + cursor: pointer; + + .iconfont { + font-size: 20px; + } + + .btn-txt { + font-size: 12px; + } +} \ No newline at end of file diff --git a/web/src/management/styles/element-variables.scss b/web/src/management/styles/element-variables.scss new file mode 100644 index 00000000..8340d777 --- /dev/null +++ b/web/src/management/styles/element-variables.scss @@ -0,0 +1,10 @@ +@import "./variable.scss"; +@import "./reset.scss"; + +/* 改变主题色变量 */ +$--color-primary: $primary-color; + +/* 改变 icon 字体路径变量,必需 */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; \ No newline at end of file diff --git a/web/src/management/styles/icon.scss b/web/src/management/styles/icon.scss new file mode 100644 index 00000000..19191e0f --- /dev/null +++ b/web/src/management/styles/icon.scss @@ -0,0 +1,126 @@ +@font-face { + font-family: "iconfont"; /* Project id 4263849 */ + src: url('//at.alicdn.com/t/c/font_4263849_tcd4y5836dg.woff2?t=1695630919866') format('woff2'), + url('//at.alicdn.com/t/c/font_4263849_tcd4y5836dg.woff?t=1695630919866') format('woff'), + url('//at.alicdn.com/t/c/font_4263849_tcd4y5836dg.ttf?t=1695630919866') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-fuzhi:before { + content: "\e6c4"; +} + +.icon-lishi:before { + content: "\e6cd"; +} + +.icon-baocun:before { + content: "\e6ce"; +} + +.icon-fanhui:before { + content: "\e6cf"; +} + +.icon-bianji:before { + content: "\e6d0"; +} + +.icon-shujutongji:before { + content: "\e6d1"; +} + +.icon-toufang:before { + content: "\e6d2"; +} + +.icon-wenjuanbianji:before { + content: "\e6ca"; +} + +.icon-jieguoyeshezhi:before { + content: "\e6cb"; +} + +.icon-wenjuanshezhi:before { + content: "\e6cc"; +} + +.icon-jiantou:before { + content: "\e6c7"; +} + +.icon-shangyi:before { + content: "\e6c8"; +} + +.icon-xiayi:before { + content: "\e6c9"; +} + +.icon-tuodong:before { + content: "\e6c5"; +} + +.icon-shanchu:before { + content: "\e6c6"; +} + +.icon-tixing-toupiao:before { + content: "\e6bc"; +} + +.icon-tixing-duoxuan:before { + content: "\e6c1"; +} + +.icon-tixing-panduanti:before { + content: "\e6c2"; +} + +.icon-tixing-danxuan:before { + content: "\e6c3"; +} + +.icon-tixing-pingfen:before { + content: "\e6be"; +} + +.icon-tixing-chengshixuanze:before { + content: "\e6bf"; +} + +.icon-tixing-duohangshuru:before { + content: "\e6b4"; +} + +.icon-tixing-danhangshuru:before { + content: "\e6b5"; +} + +.icon-tixing-tiankongti:before { + content: "\e6b7"; +} + +.icon-tixing-tupian:before { + content: "\e6bb"; +} + +.icon-chuangjian:before { + content: "\e6b3"; +} + +.icon-jinru:before { + content: "\e6b2"; +} + +.icon-erweima:before { + content: "\e6c0"; +} diff --git a/web/src/management/styles/reset-wangeditor.scss b/web/src/management/styles/reset-wangeditor.scss new file mode 100644 index 00000000..74c44009 --- /dev/null +++ b/web/src/management/styles/reset-wangeditor.scss @@ -0,0 +1,15 @@ +:root { + --w-e-textarea-bg-color: transparent; +} + +.w-e-text-container * { + font-size: inherit; +} + +.w-e-text-container [data-slate-editor] h1, .w-e-text-container [data-slate-editor] h2, .w-e-text-container [data-slate-editor] h3, .w-e-text-container [data-slate-editor] h4, .w-e-text-container [data-slate-editor] h5 { + margin: 0; +} + +.w-e-text-container [data-slate-editor] p { + margin: 0; +} \ No newline at end of file diff --git a/web/src/management/styles/reset.scss b/web/src/management/styles/reset.scss new file mode 100644 index 00000000..c967cda6 --- /dev/null +++ b/web/src/management/styles/reset.scss @@ -0,0 +1,150 @@ +@charset "utf-8"; +html, +body { + height: 100%; +} + +html { + color: #000; + background: #fff; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; + font-size: 50px; +} + +html * { + outline: 0; + -webkit-text-size-adjust: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + font-family: Pingfang SC, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; + font-size: 14px; + line-height: 1.42857143; +} + +body, +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +code, +form, +fieldset, +legend, +input, +textarea, +p, +blockquote, +th, +td, +hr, +button, +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + margin: 0; + padding: 0; +} + +input, +select, +textarea { + font-size: 100%; +} + +input { + -webkit-appearance: none; +} + +input:-ms-clear { + display: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +fieldset, +img { + border: 0; +} + +abbr, +acronym { + border: 0; + font-variant: normal; +} + +del { + text-decoration: line-through; +} + +address, +caption, +cite, +code, +dfn, +em, +th, +var { + font-style: normal; + font-weight: 500; +} + +ol, +ul { + list-style: none; +} + +caption, +th { + text-align: left; +} + +a:hover { + text-decoration: none; +} + +a:active { + text-decoration: none; +} + +ins, +a { + text-decoration: none; +} + +.hidden { + display: none; +} + +* { + text-decoration: none; + box-sizing: border-box; +} + +a:hover * { + text-decoration: none; +} \ No newline at end of file diff --git a/web/src/management/styles/variable.scss b/web/src/management/styles/variable.scss new file mode 100644 index 00000000..956a00b5 --- /dev/null +++ b/web/src/management/styles/variable.scss @@ -0,0 +1,34 @@ +$primary-color: #ffa600; +$primary-color-hover: #fbb733; +$primary-color-deep: #D48D00; +$primary-color-light: #fffcf0; + +$normal-color: #4a4c5b; +$normal-color-hover: #626369; +$normal-color-deep: #292a36; +$normal-color-light: #92959c; + + +$disable-color: #f2f4f7; +$border-color: #e3e4e8; +$sub-color: #0f8a82; + +$font-color: #6E707C; +$font-color-title: $normal-color; +$font-color-stress: #2B3035; +$font-color-invert: #FFFFFF; + +$background-color: #f6f7f9; +$background-color-light: #ffffff; +$background-color-gray: #F7F9Fb; +$background-color-dark: #E7E9EB; + +$title-color-deep: #292a36; +$title-color: #4a4c5b; +$remark-color: #4a4c5b; +$placeholder-color: #c8c9cd; +$light-focus-color: #666666; + +$spliter-color: #f7f7f7; + +$error-color: #ec4e29; diff --git a/web/src/management/utils/index.js b/web/src/management/utils/index.js new file mode 100644 index 00000000..a63cfab5 --- /dev/null +++ b/web/src/management/utils/index.js @@ -0,0 +1,84 @@ +import { defaultQuestionConfig } from '../config/questionConfig'; +import _cloneDeep from 'lodash/cloneDeep'; +import _map from 'lodash/map'; + +const generateQuestionField = () => { + const num = Math.floor(Math.random() * 1000); + return `data${num}`; +}; + +function getRandom(len) { + return Math.random() + .toString() + .slice(len && typeof len === 'number' ? 0 - len : -6); +} + +const generateHash = (hashList) => { + let hash = getRandom(); + let isExistsHash = hashList.includes(hash); + + while (isExistsHash) { + hash = getRandom(); + isExistsHash = hashList.includes(hash); + } + return hash; +}; + +function getOptions(type) { + const options = [].concat({ ..._cloneDeep(defaultQuestionConfig) }.options); + if (type === 'binary-choice') { + options[0].text = '对'; + options[1].text = '错'; + } + return options; +} + +export const getNewField = (fields) => { + let field = generateQuestionField(); + let isFieldExists = fields.includes(field); + + while (isFieldExists) { + field = generateQuestionField(); + isFieldExists = fields.includes(field); + } + return field; +}; + +export const getQuestionByType = (type, fields) => { + const newQuestion = _cloneDeep(defaultQuestionConfig); + newQuestion.type = type; + newQuestion.field = getNewField(fields); + newQuestion.options = getOptions(type); + const hashList = []; + for (const option of newQuestion.options) { + const hash = generateHash(hashList); + hashList.push(hash); + option.hash = hash; + } + return newQuestion; +}; + +export function filterQuestionPreviewData(data, currentEditOne = '') { + let indexNumber = 1; + + return _map(data, (item, index) => { + const preType = item.type; + + const newData = { + ...item, + isSelected: index === currentEditOne, + indexNumber: 0, + qIndex: index, + }; + // 根据是否展示序号,处理 indexNumber + if (newData.showIndex) { + newData.indexNumber = indexNumber; + indexNumber++; + } + + // 处理选项的方向 + newData.layout = /-v/.test(preType) ? 'vertical' : newData.layout; + + return newData; + }); +} diff --git a/web/src/materials/questions/common/config/basicConfig.js b/web/src/materials/questions/common/config/basicConfig.js new file mode 100644 index 00000000..0b86a71f --- /dev/null +++ b/web/src/materials/questions/common/config/basicConfig.js @@ -0,0 +1,36 @@ +import _pick from 'lodash/pick'; + +export default { + name: 'basicConfig', + label: '基础配置', + type: 'CheckboxGroup', + key: 'basicConfig', + labelStyle: { + 'font-weight': 'bold', + }, + options: [ + { + label: '必填', + key: 'isRequired', + }, + { + label: '显示类型', + key: 'showType', + }, + { + label: '显示序号', + key: 'showIndex', + }, + { + label: '显示分割线', + key: 'showSpliter', + tip: '题目下方分割线,仅在移动端展示。', + }, + ], + valueAdapter({ moduleConfig }) { + return _pick( + moduleConfig, + this.options.map((item) => item.key) + ); + }, +}; diff --git a/web/src/materials/questions/common/config/moduleList.js b/web/src/materials/questions/common/config/moduleList.js new file mode 100644 index 00000000..b14ce823 --- /dev/null +++ b/web/src/materials/questions/common/config/moduleList.js @@ -0,0 +1,13 @@ +// 视图type +export default { + text: 'InputModule', + textarea: 'TextareaModule', + radio: 'RadioModule', + checkbox: 'CheckboxModule', + 'binary-choice': 'BinaryChoiceModule', + 'radio-star': 'StarModule', + city: 'CityModule', + vote: 'VoteModule', + 'matrix-checkbox': 'GroupModule', + selectMoreModule: 'SelectMoreModule', +}; diff --git a/web/src/materials/questions/common/config/tagList.js b/web/src/materials/questions/common/config/tagList.js new file mode 100644 index 00000000..fdeb2aaf --- /dev/null +++ b/web/src/materials/questions/common/config/tagList.js @@ -0,0 +1,14 @@ +const config = { + mob: '手机号', + text: '单行输入框', + textarea: '多行输入框', + radio: '单选', + checkbox: '多选', + 'radio-star': '评分', + city: '城市选择', + vote: '投票', + 'binary-choice': '判断', + fillin: '填空', +}; + +export default config; diff --git a/web/src/materials/questions/common/config/typeMap.js b/web/src/materials/questions/common/config/typeMap.js new file mode 100644 index 00000000..f807c509 --- /dev/null +++ b/web/src/materials/questions/common/config/typeMap.js @@ -0,0 +1,9 @@ +// 模型type到视图type的映射 +export const typeMap = { + 'radio-v': 'radio', + 'radio-h': 'radio', + 'checkbox-v': 'checkbox', + 'checkbox-h': 'checkbox', + 'vote-checkbox': 'vote', + 'vote-radio': 'vote', +}; diff --git a/web/src/materials/questions/common/css/choice.scss b/web/src/materials/questions/common/css/choice.scss new file mode 100644 index 00000000..1c624838 --- /dev/null +++ b/web/src/materials/questions/common/css/choice.scss @@ -0,0 +1,306 @@ +@import './default.scss'; +.isPc .choice-wrapper { + .choice-box .choice-item { + &:hover { + background-color: $primary-color-light; + transition: background-color 0.3s ease-in-out; + } + &:not(:hover) { + background-color: transparent; + transition: background-color 0.3s ease-in-out; + } + } + .nest-box .choice-outer .choice-item .item-title { + display: none !important; + } +} + +.choice-wrapper { + font-size: 0; + .choice-box { + padding: 0 .2rem!important; + box-sizing: border-box; + // margin-bottom: -0.22rem; + .choice-item { + position: relative; + display: inline-flex; + align-items: center; + width: 50%; + box-sizing: border-box; + vertical-align: top; + // height: .88rem; + line-height: 0.4rem; + padding: 0.22rem 0 0.22rem 0.05rem!important; + margin-bottom: 0.08rem; + cursor: pointer; + .item-input { + position: relative; + vertical-align: top; + width: 0.32rem; + height: 0.32rem; + margin: 0rem 0.24rem 0 0; + border: 1px solid $border-color; + border-radius: 2px; + background-color: #fff; + cursor: pointer; + &[type='radio']{ + border-radius: 100%; + } + &[type='radio']::before{ + border-radius: 50%; + } + + &.print { + border-radius: 0; + } + &.print:after { + display: none; + } + &:disabled { + border-color: $border-color !important; + &::after { + background: #eee; + } + & + label { + color: #ccc !important; + } + } + + } + + .item-title { + flex: 1; + vertical-align: top; + color: $font-color; + font-size: $font-size; + overflow: hidden; + word-wrap: break-word; + cursor: pointer; + .label-img-wrapper { + width: 80%; + text-align: center; + } + .label-img { + display: inline-block !important; + width: 2rem; + height: auto; + margin-top: 0.25rem; + } + } + .center-text { + span { + display: inline-block; + width: 80%; + text-align: center; + } + } + &.is-checked { + .item-title { + color: $primary-color; + } + .qicon.qicon-gouxuan { + display: inline-block; + font-size: 0.32rem; + line-height: 0.32rem; + border-color: $primary-color; + background-color: $primary-color; + color: #fff; + border:none + } + + transition: all 0.3s ease-in-out; + } + &:not(.is-checked) { + background-color: transparent; + .item-title { + color: $font-color; + } + transition: all 0.3s ease-in-out; + } + + &.lastchild, + &.last2child { + margin-bottom: 0; + } + } + .option-wrapper { + display: flex; + // justify-content: center; + } + + .vertical { + width: 100%; + .item-title .label-img { + width: 75%; + } + // &.choice-item.last2child { + // margin-bottom: .08rem; + // } + } + } + + .answer-tip { + width: 100%; + height: auto; + font-size: 0.25rem; + color: #666; + padding: 5px; + border: 1px dashed $border-color; + } +} + +.optionRelyTips { + text-indent: 16px; + width: 100%; + height: 15px; + font-size: 14px; + line-height: 15px; + color: #aaa; +} + + +.input-wrapper { + font-size: 0; + .input-box { + outline: none; + font-size: 0.56rem; + padding: 0.4rem; + border-radius: .08rem; + background-color: #fff; + vertical-align: top; + + border: 1px solid $border-color; + width: 200%; + height: 1.61rem; + + transform: scale(0.5,0.5); + transform-origin: left top; + box-sizing: border-box; + margin-bottom: -.81rem; + overflow: hidden; + // overflow: hidden; + color: $font-color; + z-index: 10; + // &:focus, &.is-focused { + // border: 1px solid $primary-color; + // } + &:not([readonly="readonly"]):hover{ + border: 1px solid $primary-color; + } + &.print { + border: none; + border-bottom: 1px solid $border-color; + border-radius: 0; + } + &::-webkit-input-placeholder { /* WebKit browsers */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &::-moz-placeholder { /* Mozilla Firefox 19+ */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &:-ms-input-placeholder { /* Internet Explorer 10+ */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + } + .text-number-tip { + font-size: .24rem; + color: $font-color; + float: right; + margin-right: .1rem; + margin-top: .1rem; + } + + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none !important; + margin: 0; + } + + input[type="number"] { + -moz-appearance: textfield; + } +} + +.nest-box { + justify-content: space-around; + padding-left: 0 !important; + .choice-outer { + display: inline-block; + text-align: center; + .choice-item { + display: inline-block; + width: 100%; + margin-bottom: 0; + padding-left: 0 !important; + .item-input { + margin-right: 0; + border-radius: 2px; + &.ql-checked-input + .item-title { + visibility: visible; + height: auto; + opacity: 1; + } + } + .item-title { + visibility: hidden; + opacity: 0; + display: block; + height: 0.3rem; + font-size: 0.23rem; + margin-bottom: 0.06rem; + width: 100%; + color: $font-color; + position: absolute; + .item-title-text { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + display: block; + height: auto; + padding: 9px 0; + } + } + } + } + // &.choice-box { + // padding: 0; + // } +} +// input[type="radio"]{ +// cursor: pointer; +// // position: relative; +// width: 15px; +// height: 15px; +// font-size: 14px; +// } +// input[type="radio"]::before{ +// position: relative; +// content: ''; +// width: 15px; +// height: 15px; +// } +// input[type="radio"]:checked::before{ +// // position: relative; +// content: ''; +// width: 15px; +// height: 15px; +// background-color: $primary-color; +// border-color: $primary-color; +// } + +// .radio-wrapper .radio-box .radio-item.is-checked .item-input:checked { +// background-color: ${primaryColor}; +// border-color: ${primaryColor}; +// box-shadow: 0 2px 6px 0 ${shadowColor}; +// } \ No newline at end of file diff --git a/web/src/materials/questions/common/css/default.scss b/web/src/materials/questions/common/css/default.scss new file mode 100644 index 00000000..306dbee2 --- /dev/null +++ b/web/src/materials/questions/common/css/default.scss @@ -0,0 +1,44 @@ +$primary-color: #FAA600; +$primary-color-light: hsl(48, 100%, 97%); + +$title-color-deep: #292a36; +$title-color: #4a4c5b; +$font-color: #6e707c; +$remark-color: #4a4c5b; +$placeholder-color: #c8c9cd; +$light-focus-color: #666666; + +$disable-color: #f2f4f7; +$border-color: #dee2e6; + +$spliter-color: #f7f7f7; + +$error-color: #ec4e29; + + +$title-size: 0.32rem; +$font-size: 0.28rem; +$tip-size: 0.22rem; + +.el-radio__input.is-checked+.el-radio__label { + color: $font-color !important; +} + +.el-switch.is-checked .el-switch__core { + border-color: $primary-color !important; + background-color: $primary-color !important; +} + +.el-checkbox__input.is-checked .el-checkbox__inner, +.question-edit-wrapper .el-checkbox__input.is-indeterminate .el-checkbox__inner { + background-color: $primary-color !important; + border-color: $primary-color !important; +} + +.el-checkbox__input.is-focus .el-checkbox__inner { + border-color: $primary-color !important; +} + +.el-checkbox__input.is-checked+.el-checkbox__label { + color: $font-color !important; +} \ No newline at end of file diff --git a/web/src/materials/questions/common/css/formItem.scss b/web/src/materials/questions/common/css/formItem.scss new file mode 100644 index 00000000..a41c6752 --- /dev/null +++ b/web/src/materials/questions/common/css/formItem.scss @@ -0,0 +1,107 @@ +@import './default.scss'; +.question-wrapper { + position: relative; + &.gap{ + padding: 0.2rem 0 0.8rem; + } + .component-wrapper { + padding: 0 0.4rem; + } + .noPadding{ + padding: 0; + } + + &.no-padding { + .component-wrapper { + padding: 0; + } + } + + &.no-out-padding { + padding: 0 0 0.2rem; + } + + .clear { + clear: both; + } + + &.question-type-section { + padding-bottom: 0; + .module-title { + padding-bottom: 0; + } + } + &.horizon { + display: flex; + .module-title .m-title { + width: 1.2rem; + margin-right: 8px; + text-align: justify; + position: relative; + &::before { + content: ':'; + display: block; + position: absolute; + right: -5px; + } + &::after { + content: ''; + display: inline-block; + width: 100%; + } + } + .component-wrapper { + flex: 1; + } + &.hasError { + margin-bottom: 0.4rem; + } + .module-err-tip { + position: absolute; + padding: 0; + margin-top: -5px; + left: 0; + .tip-text { + padding-top: 0; + } + } + } + &.hasError { + .item-border { + border-color: $error-color; + } + /*由于错误提示可能多行,因此有错误时取消margin,让错误提示撑开边距*/ + margin-bottom: 0; + } + + &.special .module-err-tip { + padding: 0.12rem 0.75rem 0; + } + &.spliter { + border-bottom: 0.12rem solid $spliter-color; + } + + &:last-child { + border-bottom: 0; + } + .sort-tip { + font-size: 0.26rem; + line-height: 0.26rem; + opacity: 0.5; + margin-top: -0.24rem; + margin-bottom: 0.4rem; + padding-left: 0.4rem; + color: #92949d; + } +} + + + +.isPc .question-form-item { + border-bottom: none; + .sort-tip { + padding-left: 0; + margin-bottom: 0.24rem; + margin-top: -0.14rem; + } +} \ No newline at end of file diff --git a/web/src/materials/questions/common/css/group.scss b/web/src/materials/questions/common/css/group.scss new file mode 100644 index 00000000..0eed4e44 --- /dev/null +++ b/web/src/materials/questions/common/css/group.scss @@ -0,0 +1,167 @@ +@import './default.scss'; + .isPc .group-wrapper.group-radio .module-err-tip { + position: relative; + } + .isPc .group-wrapper.group-radio .question-form-item { + margin-bottom: 0; + } + + .isPc .group-wrapper.group-radio { + .matrix-select-more { + margin-left: 0; + .module-err-tip { + left: 0; + } + } + } + .group-wrapper { + width: 100%; + // overflow: hidden; + &::-webkit-scrollbar { + display: block; + height: 10px; + background-color: #F2F4F7; + } + &::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #E3E4E8; + } + &::-webkit-scrollbar-track { + height: 16px; + background: #F2F4F7; + } + .form-item-wrapper { + padding: 0 0 .2rem 0; + box-sizing: border-box; + } + .question-form-item { + padding: .16rem 0 .4rem; + border-bottom: none; + + .module-title { + padding: 0 0 .24rem 0.2rem; + font-size: .28rem; + font-weight: 400; + } + .component-wrapper { + padding: 0; + .star-wrapper { + padding: 0 .35rem; + } + .nps-wrapper { + padding: 0; + } + } + + &:last-child { + padding-bottom: 0; + } + + &.hasError .module-err-tip.show { + padding: 0; + } + } + + .box { + display: flex; + } + .group-title.main { + background: #F2F4F7; + padding: 0 ; + min-height: .4rem; + line-height: .4rem; + box-sizing: border-box; + display: flex; + span { + display: inline-block; + box-sizing: border-box; + vertical-align: top; + font-size: .28rem; + color: $title-color; + text-align: center; + line-height: 0.4rem; + // font-weight: 500; + width: 100%; + word-break: break-word; + border-left: 1px dotted rgba(200, 201, 205, 1); + height: auto; + } + + & > span:first-child { + border: none; + } + .group-title-text span { + border: none; + } + &>span{ + padding: .2rem .1rem; + } + } + + &.group-radio { + .module-title { + // color: $font-color; + line-height: .36rem; + } + .question-form-item { + padding: .4rem 0 .4rem 0; + } + .checkbox-wrapper, .radio-wrapper { + .radio-box.nest-box .radio-outer .radio-item { + padding: .22rem 0; + } + } + .module-err-tip { + margin-top: .25rem; + } + } + } + + .horizontal { + .group-title { + padding-left: 25%; + } + .question-form-item { + width: 100%; + font-size: 0; + overflow: hidden; + border-bottom: 1px solid #eee; + margin-bottom: .2rem; + padding-top: .2rem; + .module-title { + float: left; + width: 27%; + vertical-align: top; + font-size: .26rem !important; + } + .checkbox-wrapper, .radio-wrapper { + display: inline-block; + width: 70%; + vertical-align: top; + border-bottom: none; + } + } + } + + .select-more-label { + display: block; + margin-top: .2rem; + // margin-bottom: -.2rem; + height: .3rem; + line-height: .3rem; + width: 100%; + color: #666; + font-size: .26rem; + } + + .matrix-select-more { + max-width: 10rem; + .question-form-item { + padding-top: 0px; + .m-select-more { + margin-top: .3rem; + margin-bottom: .5rem; + width: 100% !important; + } + } + } \ No newline at end of file diff --git a/web/src/materials/questions/common/css/icon.scss b/web/src/materials/questions/common/css/icon.scss new file mode 100644 index 00000000..76baa069 --- /dev/null +++ b/web/src/materials/questions/common/css/icon.scss @@ -0,0 +1,38 @@ +@font-face { + font-family: "qicon"; /* Project id 4263885 */ + src: url('//at.alicdn.com/t/c/font_4263885_u91txz1d68.woff2?t=1697079806138') format('woff2'), + url('//at.alicdn.com/t/c/font_4263885_u91txz1d68.woff?t=1697079806138') format('woff'), + url('//at.alicdn.com/t/c/font_4263885_u91txz1d68.ttf?t=1697079806138') format('truetype'); +} + +.qicon { + font-family: "qicon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.qicon-tishi:before { + content: "\e6cc"; +} + +.qicon-fuzhi:before { + content: "\e6c4"; +} + +.qicon-tuodong:before { + content: "\e6c7"; +} + +.qicon-gouxuan:before { + content: "\a6c8"; +} + +.qicon-aixin:before { + content: "\e6cd"; +} + +.qicon-xingxing:before { + content: "\a6ca"; +} diff --git a/web/src/materials/questions/common/css/input.scss b/web/src/materials/questions/common/css/input.scss new file mode 100644 index 00000000..4e3c6a35 --- /dev/null +++ b/web/src/materials/questions/common/css/input.scss @@ -0,0 +1,79 @@ +@import './default.scss'; +.input-wrapper { + font-size: 0; + .input-box { + outline: none; + font-size: 0.56rem; + padding: 0.4rem; + border-radius: .08rem; + background-color: #fff; + vertical-align: top; + + border: 1px solid $border-color; + width: 200%; + height: 1.61rem; + + transform: scale(0.5,0.5); + transform-origin: left top; + box-sizing: border-box; + margin-bottom: -.81rem; + overflow: hidden; + // overflow: hidden; + color: $font-color; + z-index: 10; + &.is-focused:focus { + border: 1px solid $primary-color; + height: 3.5rem; + margin-bottom: -1.75rem; + overflow-y: scroll; + } + &:not([readonly="readonly"]):hover{ + border: 1px solid $primary-color; + } + &.print { + border: none; + border-bottom: 1px solid $border-color; + border-radius: 0; + } + &::-webkit-input-placeholder { /* WebKit browsers */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &::-moz-placeholder { /* Mozilla Firefox 19+ */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &:-ms-input-placeholder { /* Internet Explorer 10+ */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + } + .text-number-tip { + font-size: .24rem; + color: $font-color; + float: right; + margin-right: .1rem; + margin-top: .1rem; + } + + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none !important; + margin: 0; + } + + input[type="number"] { + -moz-appearance: textfield; + } + textarea{ + resize: none; + } +} \ No newline at end of file diff --git a/web/src/materials/questions/common/css/option.scss b/web/src/materials/questions/common/css/option.scss new file mode 100644 index 00000000..203f4105 --- /dev/null +++ b/web/src/materials/questions/common/css/option.scss @@ -0,0 +1,230 @@ +@import "./default.scss"; + +.question-preview .radio-wrapper { + font-size: 14px; + .radio-box { + .draggHandle { + cursor: move; + } + #sortDraggable { + user-select: none; + padding-right: 0.08rem; + .sortable-drag, + .sortable-ghost { + .radio-item { + border-color: $primary-color; + border-radius: 0.04rem; + } + } + .sortable-fallback { + .radio-item { + background-color: $primary-color; + } + } + } + .radio-item { + position: relative; + display: inline-flex; + width: 50%; + box-sizing: border-box; + vertical-align: top; + // padding: 0.1rem 0.2rem 0.1rem 0.35rem; + margin-bottom: 0.36rem; + cursor: pointer; + border: 1px solid transparent; + align-items: center; + .item-input { + position: relative; + vertical-align: top; + width: 0.32rem; + height: 0.32rem; + margin: 0 0.24rem 0 0; + border: 1px solid $border-color; + border-radius: 100%; + background-color: #fff; + cursor: pointer; + } + + .item-title { + flex: 1; + vertical-align: top; + color: $font-color; + font-size: $font-size; + overflow: hidden; + word-wrap: break-word; + cursor: pointer; + padding: 9px 0; + .label-img { + display: block; + width: 1.7rem; + height: 1.7rem; + margin-top: 0.25rem; + } + .render-html { + display: block; + margin: 5px 0; + } + } + .center-text { + span { + display: inline-block; + text-align: center; + } + } + + &.lastchild, + &.last2child { + margin-bottom: 0; + } + &.is-checked { + .item-title { + color: $primary-color; + } + .item-input { + background-color: $primary-color; + border-color: $primary-color; + } + .text-checked { + font-size: 0.20rem; + line-height: 0.32rem; + color: #fff; + text-align: center; + } + .checked:before { + display: inline-block; + margin-left: 0.05rem; + font-size: 0.20rem; + line-height: 0.32rem; + color: #fff; + content: '✓'; + } + transition: all 0.3s ease-in-out; + } + &:not(.is-checked) { + background-color: transparent; + .item-title { + color: $font-color; + } + transition: all 0.3s ease-in-out; + } + &.freezing-right { + background-color: $primary-color-light; + } + &.freezing-wrong { + background-color: #fafbfc; + } + .answer { + color: $normal-color; + font-size: 13px; + display: flex; + align-items: center; + .answer-circle { + display: inline-block; + width: 0.3rem; + height: 0.3rem; + text-align: center; + line-height: 0.3rem; + border-radius: 0.15rem; + margin-right: 0.1rem; + vertical-align: sub; + &.success { + color: white; + background: #05c98a; + } + &.error { + color: white; + background: #ff612c; + } + } + } + } + .vertical { + width: 100%; + &.radio-item.last2child { + margin-bottom: 0.36rem; + } + } + .option-jumpto-tip { + position: relative; + display: block; + color: $placeholder-color; + font-size: 12px; + margin-top: 12px; + } + } + + .nest-box { + display: flex; + justify-content: space-around; + .radio-outer { + flex: 1; + display: inline-block; + text-align: center; + .radio-item { + display: inline-block; + margin-bottom: 0; + .item-input { + margin-right: 0; + } + .item-title { + visibility: hidden; + opacity: 0; + display: block; + height: 0.3rem; + font-size: 0.23rem; + margin-top: 0.05rem; + margin-bottom: 0.06rem; + color: $font-color; + } + } + } + &.radio-box { + padding: 0; + } + } + .showScoreItem { + font-size: 12px; + display: inline-block; + position: absolute; + bottom: -18px; + left: 40px; + color: $placeholder-color; + } +} +.radio { + .radio-box .radio-item.enable-hover:hover { + border: 1px dashed $placeholder-color; + } +} +.optionRelyTips { + text-indent: 16px; + width: 100%; + height: 15px; + font-size: 14px; + line-height: 15px; + color: #aaa; +} + +.answer-tip { + position: relative; + color: $font-color; + font-size: 13px; + background: #f8f9fb; + margin-top: 0.15rem; + padding: 15px; + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + border: 0.2rem solid transparent; + border-top: 0.2rem solid #f3f4f7; + border-left: 0.2rem solid #f3f4f7; + } + p { + display: flex; + } + .answer { + flex: 3; + } +} \ No newline at end of file diff --git a/web/src/materials/questions/common/css/question.scss b/web/src/materials/questions/common/css/question.scss new file mode 100644 index 00000000..a709afdd --- /dev/null +++ b/web/src/materials/questions/common/css/question.scss @@ -0,0 +1,10 @@ +@import './default.scss'; +.question { + position: relative; + padding: 0.2rem 0 0.3rem; + + &-block { + padding: 0 0.4rem; + } +} + \ No newline at end of file diff --git a/web/src/materials/questions/common/css/radioQuestion.scss b/web/src/materials/questions/common/css/radioQuestion.scss new file mode 100644 index 00000000..368a90f7 --- /dev/null +++ b/web/src/materials/questions/common/css/radioQuestion.scss @@ -0,0 +1,96 @@ +@import './default.scss'; +.question-form-item { + position: relative; + padding: 0.2rem 0 0.8rem; + + .component-wrapper { + padding: 0 0.4rem; + } + .noPadding{ + padding: 0; + } + + &.no-padding { + .component-wrapper { + padding: 0; + } + } + + &.no-out-padding { + padding: 0 0 0.2rem; + } + + .clear { + clear: both; + } + + &.question-type-section { + padding-bottom: 0; + .module-title { + padding-bottom: 0; + } + } + &.horizon { + display: flex; + .module-title .m-title { + width: 1.2rem; + margin-right: 8px; + text-align: justify; + position: relative; + &::before { + content: ':'; + display: block; + position: absolute; + right: -5px; + } + &::after { + content: ''; + display: inline-block; + width: 100%; + } + } + .component-wrapper { + flex: 1; + } + &.hasError { + margin-bottom: 0.4rem; + } + .module-err-tip { + position: absolute; + padding: 0; + margin-top: -5px; + left: 0; + .tip-text { + padding-top: 0; + } + } + } + &.hasError { + .item-border { + border-color: $error-color; + } + /*由于错误提示可能多行,因此有错误时取消margin,让错误提示撑开边距*/ + margin-bottom: 0; + } + + &.special .module-err-tip { + padding: 0.12rem 0.75rem 0; + } + &.spliter { + border-bottom: 0.12rem solid $spliter-color; + } + + &:last-child { + border-bottom: 0; + } + .sort-tip { + font-size: 0.26rem; + line-height: 0.26rem; + opacity: 0.5; + margin-top: -0.24rem; + margin-bottom: 0.4rem; + padding-left: 0.4rem; + color: #92949d; + } + } + \ No newline at end of file diff --git a/web/src/materials/questions/common/css/radioStar.scss b/web/src/materials/questions/common/css/radioStar.scss new file mode 100644 index 00000000..253cfc92 --- /dev/null +++ b/web/src/materials/questions/common/css/radioStar.scss @@ -0,0 +1,86 @@ +.star-wrapper-main { + // .isShowInput{ + // padding-bottom: 0 !important ; + // } + .explain { + line-height: 0.48rem; + font-size: 0.24rem; + color: #92949D; + padding: 0 0.4rem; + } + .radio-star { + &.isPc { + margin-bottom: 0.2rem; + } + } + .matrix-radio-star { + &.isPc { + margin-bottom: -0.2rem; + } + } + .star-box { + display: flex; + justify-content: space-between; + margin-bottom: 0.2rem; + } + .star-item { + display: inline-block; + font-size: .42rem; + flex: 1; + text-align: center; + cursor: pointer; + &.qicon { + color: #E3E4E8; + &.on { + color: $primary-color; + } + &.off { + color: #E3E4E8; + } + } + &.number { + color: #fff; + height: 0.62rem; + font-size: 0.28rem; + line-height: 0.62rem; + &.on { + background-color: $primary-color; + } + &.off { + background-color: #E3E4E8; + } + &:not(:last-child) { + margin-right: .08rem; + } + } + + } + .print { + width: 96%; + margin-left: -3%; + display: flex; + div { + flex: 1; + display: inline-block; + div { + display: inline-block; + color: #333; + font-size: 0.27rem; + height: .32rem; + line-height: .32rem; + vertical-align: middle; + } + .box { + display: inline-block; + width: .32rem; + height: .32rem; + border: 1px solid #ddd; + } + } + } + + .hidden { + display: none; + visibility: hidden; + } + } \ No newline at end of file diff --git a/web/src/materials/questions/common/css/textarea.scss b/web/src/materials/questions/common/css/textarea.scss new file mode 100644 index 00000000..74cb8af6 --- /dev/null +++ b/web/src/materials/questions/common/css/textarea.scss @@ -0,0 +1,81 @@ +@import './default.scss'; +.textarea-wrapper { + font-size: 0; + .input-box { + resize: vertical; + padding: 0.4rem; + border-radius: .08rem; + background-color: #fff; + border: 1px solid #ddd; + -webkit-appearance: none; + vertical-align: top; + + width: 200%; + font-size: 0.54rem; + height: 1.61rem; + transform: scale(0.5, 0.5); + transform-origin: 0 0; + box-sizing: border-box; + margin-bottom: -.81rem; + overflow: hidden; + resize: none; + transition: height .2s ease-out; + -webkit-transition: height .2s ease-out; + color: $font-color; + &:focus, &.is-focused { + border: 1px solid $primary-color; + height: 3.5rem; + margin-bottom: -1.75rem; + overflow-y: scroll; + } + &:hover{ + border: 1px solid $primary-color; + } + &::-webkit-input-placeholder { /* WebKit browsers */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &::-moz-placeholder { /* Mozilla Firefox 19+ */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + &:-ms-input-placeholder { /* Internet Explorer 10+ */ + font-size: .56rem; + font-weight: 300; + color: $placeholder-color; + } + } + + .print-line-wrapper { + width: 96%; + margin: 0 2%; + .print-line { + height: .75rem; + border-bottom: 1px solid #ddd; + } + } + + .text-number-tip { + font-size: .24rem; + color: $font-color; + float: right; + margin-top: .1rem; + } + + .answer-tip { + width: 98%; + height: auto; + font-size: 0.25rem; + color: #666; + margin-top: .2rem; + padding: 5px; + border: 1px dashed $border-color; + } +} \ No newline at end of file diff --git a/web/src/materials/questions/common/css/title.scss b/web/src/materials/questions/common/css/title.scss new file mode 100644 index 00000000..b41856cb --- /dev/null +++ b/web/src/materials/questions/common/css/title.scss @@ -0,0 +1,75 @@ +@import './default.scss'; +.question-form-item.isSelected{ + background-color: #f2f4f7; + -webkit-box-shadow: 0 0 5px #e3e4e8; + box-shadow: 0 0 5px #e3e4e8; +} +.module-title { + position: relative; + height: auto; + line-height: 0.45rem; + font-size: $title-size; + padding: 0 0.4rem 0.4rem; + color: #000000; + font-weight: normal; + &-required { + color: $error-color; + position: absolute; + left: 0.16rem; + top: 0rem; + font-size: 0.2rem; + // transform: scale(0.5); + transform-origin: left top; + } + .score-text { + color: #999; + margin-left: 0.2rem; + font-size: 0.24rem; + } + &-title { + zoom: 1; + display: flex; + font-size: $title-size; + img { + max-width: 100%; + } + .index { + float: left; + padding-right: 0.06rem; + font-size: $title-size; + } + &-text{ + font-size: $title-size; + p, span{ + font-size: inherit; + } + } + em { + font-style: italic; + } + u { + text-decoration: underline; + } + .richeditor { + position: relative; + cursor: pointer; + width: 100%; + margin: -10px 0; + flex: 1; + font-size: .32rem; + background-color: #fff; + } + } + + .m-tag { + border: 1px solid $primary-color; + font-size: 0.18rem; + height: 0.4rem; + line-height: 0.4rem; + display: inline-block; + color: $primary-color; + padding: 0 0.16rem; + margin-left: 0.16rem; + border-radius: 0 0.06rem 0 0.06rem; + } +} diff --git a/web/src/materials/questions/common/css/vote.scss b/web/src/materials/questions/common/css/vote.scss new file mode 100644 index 00000000..99e73d10 --- /dev/null +++ b/web/src/materials/questions/common/css/vote.scss @@ -0,0 +1,30 @@ +@import './default.scss'; +// .vote-wrapper { +// .radio-wrapper.vote .radio-box .radio-item { +// padding-left: .35rem; +// &:hover { +// background-color: transparent; +// } +// } + .vote-detail{ + padding-top: 0.12rem; + align-items:center; + display: flex; + .process-outer{ + flex: 1; + } + .vote-percent{ + width: 0.86rem; + font-size: 0.24rem; + color: $font-color; + margin-left: 0.24rem; + } + .vote-count{ + width: 0.8rem; + margin-left: 0.1rem; + text-align: right; + font-size: 0.24rem; + color: $font-color; + } + } +// } diff --git a/web/src/materials/questions/common/utils/getOptionHash.js b/web/src/materials/questions/common/utils/getOptionHash.js new file mode 100644 index 00000000..3bda318c --- /dev/null +++ b/web/src/materials/questions/common/utils/getOptionHash.js @@ -0,0 +1,23 @@ +function getRandom(len) { + return Math.random() + .toString() + .slice(len && typeof len === 'number' ? 0 - len : -6); +} +export default class GetHash { + constructor() { + this.hashMap = {}; + } + + getHash(len) { + let random = getRandom(len); + while (random in this.hashMap) { + random = getRandom(len); + } + this.hashMap[random] = true; + return random; + } +} + +const hashGen = new GetHash(); + +export { hashGen }; diff --git a/web/src/materials/questions/common/utils/index.js b/web/src/materials/questions/common/utils/index.js new file mode 100644 index 00000000..f279dbb3 --- /dev/null +++ b/web/src/materials/questions/common/utils/index.js @@ -0,0 +1,84 @@ +import _forEach from 'lodash/forEach'; +import _trim from 'lodash/trim'; +import { escapeFilterXSS } from '@/common/xss'; + +// 获取选项的hash +export function getNewHash(hashMap) { + let random = getRandom(); + while (random in hashMap) { + random = getRandom(); + } + return random; +} + +// 获取长度为6或者指定长度的的随机字符串 +export function getRandom(len) { + return Math.random() + .toString() + .slice(len && typeof len === 'number' ? 0 - len : -6); +} + +const optionListItem = [ + 'text', + 'imageUrl', + 'others', + 'mustOthers', + 'limit', + 'score', + 'othersKey', + 'placeholderDesc', + 'hash', +]; + +// 根据批量导入的问题生成多个选项 +export function getMultiOptionByText(text) { + let moduleData = []; + let data = text.split('\n').filter((item) => item.trim()); + if (data && data.length > 0) { + _forEach(data, (d) => { + const rData = d.split('\t'); + let rObj = {}, + j = 0; + let hashMap = {}; + try { + _forEach(optionListItem, (key) => { + switch (key) { + case 'mustOthers': + rObj[key] = !( + _trim(rData[j]) === 'false' || _trim(rData[j]) === '' + ); + j++; + break; + case 'others': + rObj[key] = !( + _trim(rData[j]) === 'false' || _trim(rData[j]) === '' + ); + j++; + break; + case 'score': + rObj[key] = parseInt(_trim(rData[j])) + ? parseInt(_trim(rData[j])) + : 0; + j++; + break; + case 'hash': + rObj[key] = parseInt(_trim(rData[j])) + ? parseInt(_trim(rData[j])) + : getNewHash(hashMap); + j++; + hashMap[rObj[key]] = true; + break; + default: + rObj[key] = escapeFilterXSS(_trim(rData[j])); + j++; + break; + } + }); + } catch (e) { + console.error(e); + } + moduleData.push(rObj); + }); + return moduleData; + } +} diff --git a/web/src/materials/questions/components/AdvancedConfig/OptionConfig.vue b/web/src/materials/questions/components/AdvancedConfig/OptionConfig.vue new file mode 100644 index 00000000..a4be0ab7 --- /dev/null +++ b/web/src/materials/questions/components/AdvancedConfig/OptionConfig.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/web/src/materials/questions/components/AdvancedConfig/RateConfig.vue b/web/src/materials/questions/components/AdvancedConfig/RateConfig.vue new file mode 100644 index 00000000..8a26bc47 --- /dev/null +++ b/web/src/materials/questions/components/AdvancedConfig/RateConfig.vue @@ -0,0 +1,177 @@ + + + diff --git a/web/src/materials/questions/components/ErrorTip.vue b/web/src/materials/questions/components/ErrorTip.vue new file mode 100644 index 00000000..8a516d56 --- /dev/null +++ b/web/src/materials/questions/components/ErrorTip.vue @@ -0,0 +1,65 @@ + + + + diff --git a/web/src/materials/questions/components/ExtraIcon.vue b/web/src/materials/questions/components/ExtraIcon.vue new file mode 100644 index 00000000..d3ffee69 --- /dev/null +++ b/web/src/materials/questions/components/ExtraIcon.vue @@ -0,0 +1,118 @@ + + + diff --git a/web/src/materials/questions/components/Options/BatchAddPopover.vue b/web/src/materials/questions/components/Options/BatchAddPopover.vue new file mode 100644 index 00000000..053a1e34 --- /dev/null +++ b/web/src/materials/questions/components/Options/BatchAddPopover.vue @@ -0,0 +1,79 @@ + + + diff --git a/web/src/materials/questions/components/Options/OptionEdit.vue b/web/src/materials/questions/components/Options/OptionEdit.vue new file mode 100644 index 00000000..786b95d0 --- /dev/null +++ b/web/src/materials/questions/components/Options/OptionEdit.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/web/src/materials/questions/components/Options/OptionEditBar.vue b/web/src/materials/questions/components/Options/OptionEditBar.vue new file mode 100644 index 00000000..df656065 --- /dev/null +++ b/web/src/materials/questions/components/Options/OptionEditBar.vue @@ -0,0 +1,169 @@ + + diff --git a/web/src/materials/questions/components/Options/OptionSetting.vue b/web/src/materials/questions/components/Options/OptionSetting.vue new file mode 100644 index 00000000..d3bbeded --- /dev/null +++ b/web/src/materials/questions/components/Options/OptionSetting.vue @@ -0,0 +1,258 @@ + + + diff --git a/web/src/materials/questions/components/Options/UseOptionBase.jsx b/web/src/materials/questions/components/Options/UseOptionBase.jsx new file mode 100644 index 00000000..a0d9a60e --- /dev/null +++ b/web/src/materials/questions/components/Options/UseOptionBase.jsx @@ -0,0 +1,60 @@ +import { ref } from 'vue'; +import { cloneDeep } from 'lodash'; + +import GetHash from '../../common/utils/getOptionHash'; + +function useOptionBase(options) { + const optionList = ref(options); + const addOption = (text = '选项', others = false, index = -1, field) => { + // const {} = payload + let addOne; + if (optionList.value[0]) { + addOne = cloneDeep(optionList.value[0]); + } else { + addOne = { + text: '', + hash: '', + imageUrl: '', + others: false, + mustOthers: false, + othersKey: '', + placeholderDesc: '', + score: 0, + limit: '', + }; + } + if (typeof text !== 'string') { + text = '选项'; + } + + const getHash = new GetHash(); + addOne.hash = getHash.getHash(); + for (const i in addOne) { + if (i === 'others') { + addOne[i] = others; + if(others) addOne.othersKey = `${field}_${addOne.hash}`; + } else if (i === 'mustOthers') { + addOne[i] = false; + } else if (i === 'text') { + addOne[i] = text; + } + } + let myoptionList = cloneDeep(optionList.value); + if (index < 0) { + myoptionList.push(addOne); + } else { + myoptionList.splice(index + 1, 0, addOne); + } + return myoptionList; + }; + + const addOtherOption = (field) => { + return addOption('其他', true, -1, field); + }; + return { + addOption, + addOtherOption, + }; +} + +export default useOptionBase; diff --git a/web/src/materials/questions/components/Progress.vue b/web/src/materials/questions/components/Progress.vue new file mode 100644 index 00000000..7b09ee61 --- /dev/null +++ b/web/src/materials/questions/components/Progress.vue @@ -0,0 +1,60 @@ + + + diff --git a/web/src/materials/questions/questionLoader.js b/web/src/materials/questions/questionLoader.js new file mode 100644 index 00000000..54de424b --- /dev/null +++ b/web/src/materials/questions/questionLoader.js @@ -0,0 +1,55 @@ +import ComponentLoader from '../utils/componentLoader'; +import moduleList from './common/config/moduleList'; +export class MaterialLoader extends ComponentLoader { + metaCache = {}; + inited = false; + async init({ typeList }) { + if (this.inited) { + return; + } + this.inited = true; + this.componentInfoList = typeList.map((type) => ({ + type, + path: moduleList[type], + })); + await this.loadComponents(); + await this.loadMetas(); + } + + dynamicImport(path) { + return import(`@/materials/questions/widgets/${path}`); + } + + setMeta(type, config) { + this.components[type].meta = config; + } + + async loadMeta(type, path) { + if (this.metaCache[type]) { + return this.metaCache[type]; + } else { + if (!this.components[type]) { + console.error('The component has not been loaded yet'); + } + path = path || this.components[type]?.path || type; + const res = await import(`@/materials/questions/widgets/${path}/meta.js`); + this.metaCache[type] = res.default || res.meta || null; + return this.metaCache[type]; + } + } + + getMeta(type) { + return this.metaCache[type] ? this.metaCache[type] : {}; + } + + loadMetas(typeList) { + if (!typeList) { + typeList = this.componentInfoList.map((item) => item.type); + } + return Promise.all(typeList.map((type) => this.loadMeta(type))); + } +} + +const quetsionLoader = new MaterialLoader(); + +export default quetsionLoader; diff --git a/web/src/materials/questions/widgets/BaseChoice/index.jsx b/web/src/materials/questions/widgets/BaseChoice/index.jsx new file mode 100644 index 00000000..8f38de1d --- /dev/null +++ b/web/src/materials/questions/widgets/BaseChoice/index.jsx @@ -0,0 +1,192 @@ +import { defineComponent, computed } from 'vue'; +import { findIndex, includes } from 'lodash'; +import { filterXSS } from '@/common/xss'; +import '../../common/css/choice.scss'; + +export default defineComponent({ + name: 'BaseChoice', + props: { + uiTarget: { + type: String, + default: 'radio', + }, + hideText: { + type: Boolean, + default: false, + }, + isMatrix: { + type: Boolean, + default: false, + }, + choiceStyle: { + type: String, + default: '', + }, + name: { + type: String, + default: '', + }, + readonly: { + type: Boolean, + default: false, + }, + options: { + type: Array, + default: () => [], + }, + value: { + type: [Array, String], + default: () => { + return ''; + }, + }, + layout: { + type: String, + default: 'vertical', + }, + voteTotal: { + type: Number, + default: 10, + }, + }, + setup(props, { emit }) { + const getOptions = computed(() => { + return props.options; + }); + const isChecked = (item) => { + if (props.uiTarget === 'radio') { + return props.value === item.hash; + } else { + return props.value.includes(item.hash); + } + }; + const onRadioClick = (item, $event) => { + $event && $event.stopPropagation(); + $event && $event.preventDefault(); + emit('change', item.hash); + }; + const onCheckboxClick = (item, $event) => { + $event && $event.stopPropagation(); + $event && $event.preventDefault(); + const targetValue = item.hash; + let values = props.value; + if (!includes(values, targetValue)) { + values.push(targetValue); + } else { + const index = findIndex(values, (val) => val === targetValue); + if (index !== -1) { + values.splice(index, 1); + } + } + emit('change', values); + // return values + }; + return { + getOptions, + isChecked, + onRadioClick, + onCheckboxClick, + }; + }, + render() { + const { uiTarget, isMatrix, hideText, getOptions, isChecked } = this; + return ( +
+
+ {getOptions.map((item, index) => { + return ( + !item.hide && ( +
+
+ {!/^\s*$/.test(item.text) && ( +
{ + if (this.readonly) return; + if (item.disabled) return; + if (uiTarget === 'radio') + this.onRadioClick(item, $event); + if (uiTarget === 'checkbox') + this.onCheckboxClick(item, $event); + }} + > + + +
+ )} +
+ {!this.readonly + ? item.others && + isChecked(item) && + this.$scopedSlots.selectMore?.({ + showTitle: false, + selectMoreConfig: { + type: 'selectMoreModule', + index: index, + field: item.othersKey, + placeholder: item.placeholderDesc, + require: item.mustOthers, + value: item.othersValue, + }, + }) + : item.others && + this.$scopedSlots.selectMore?.({ + showTitle: false, + selectMoreConfig: { + type: 'selectMoreModule', + index: index, + field: item.othersKey, + placeholder: item.placeholderDesc, + require: item.mustOthers, + value: item.othersValue, + }, + })} +
+ ) + ); + })} +
+
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/BaseInput/index.jsx b/web/src/materials/questions/widgets/BaseInput/index.jsx new file mode 100644 index 00000000..28f5d8a6 --- /dev/null +++ b/web/src/materials/questions/widgets/BaseInput/index.jsx @@ -0,0 +1,100 @@ +import { defineComponent } from 'vue'; +import '../../common/css/choice.scss'; +import '../../common/css/input.scss'; + +export default defineComponent({ + name: 'baseInput', + props: { + uiTarget: { + type: String, + default: 'radio', + }, + customClass: { + type: String, + default: '', + }, + type: { + type: String, + default: '', + }, + name: { + type: String, + default: '', + }, + readonly: { + type: Boolean, + default: false, + }, + placeholder: { + type: String, + default: '请填写', + }, + maxlength: { + type: Number, + default: 500, + }, + minlength: { + type: Number, + default: 0, + }, + value: { + type: String, + default: '', + }, + }, + setup(props, { emit }) { + const onBlur = () => { + emit('blur'); + }; + const onInput = (e) => { + emit('input', e); + }; + const onChange = (e) => { + emit('change', e); + }; + const onFocus = () => { + if (props.readonly) return false; + emit('focus'); + }; + return { + onBlur, + onInput, + onFocus, + onChange, + }; + }, + render(h) { + const { uiTarget, customClass } = this; + return ( +
+ {h( + uiTarget, + { + // class: ['input-box','item-border', ], + class: ['input-box item-border', customClass], + attrs: { + type: this.type, + readonly: this.readonly, + placeholder: this.placeholder, + name: this.name, + value: this.value, + maxlength: this.maxlength, + minlength: this.minlength, + autocomplete: 'off', + }, + on: { + blur: this.onBlur, + input: this.onInput, + focus: this.onFocus, + change: this.onChange, + }, + }, + [this.value] + )} + {this.$slots.default} + {/* {this.$scopedSlots.default} */} + {/* {renderSlot(this.$slots, 'default')} */} +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/BaseRate/index.jsx b/web/src/materials/questions/widgets/BaseRate/index.jsx new file mode 100644 index 00000000..51b541bb --- /dev/null +++ b/web/src/materials/questions/widgets/BaseRate/index.jsx @@ -0,0 +1,84 @@ +import { defineComponent, computed } from 'vue'; +import '../../common/css/radioStar.scss'; +export default defineComponent({ + name: 'BaseRate', + props: { + name: { + type: String, + default: '', + }, + value: { + type: [String, Number], + default: 0, + }, + min: { + type: Number, + default: 1, + }, + max: { + type: Number, + default: 5, + }, + iconClass: { + type: String, + default: 'number', + }, + readonly: { + type: Boolean, + default: false, + }, + }, + setup(props, { emit }) { + const rating = computed({ + get() { + return props.value; + }, + set(val) { + emit('change', val); + }, + }); + const range = computed(() => { + const { min, max } = props; + if (min > max) { + return []; + } + const res = []; + for (let i = min; i <= max; i++) { + res.push(i); + } + return res; + }); + const handleClick = (num) => { + if (props.readonly) return; + rating.value = num; + }; + return { + rating, + range, + handleClick, + }; + }, + render() { + const { rating, range, iconClass } = this; + + return ( +
+
+ {range.map((num, index) => { + return ( +
{ + this.handleClick(num); + }} + > + {iconClass === 'number' ? num : ''} +
+ ); + })} +
+
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/BinaryChoiceModule/index.jsx b/web/src/materials/questions/widgets/BinaryChoiceModule/index.jsx new file mode 100644 index 00000000..5664ad0c --- /dev/null +++ b/web/src/materials/questions/widgets/BinaryChoiceModule/index.jsx @@ -0,0 +1,69 @@ +import baseChoice from '../BaseChoice'; +import { defineComponent } from 'vue'; +import metaConfig from './meta.js'; +export const meta = metaConfig; +/** + * 支持配置: + * 排列方式, layout + */ +export default defineComponent({ + name: 'BinaryChoiceModule', + components: { baseChoice }, + props: { + type: { + type: String, + default: '', + }, + field: { + type: String, + default: '', + }, + value: { + type: String, + default: '', + }, + layout: { + type: String, + default: 'vertical', + }, + options: { + type: Array, + default: () => [], + }, + readonly: { + type: Boolean, + default: false, + }, + }, + setup(props, { emit }) { + const onChange = (value) => { + const key = props.field; + emit('change', { + key, + value, + }); + }; + return { + onChange, + }; + }, + render() { + const { readonly, field } = this; + const props = { + ...this.$props, + readonly, + name: field, + }; + return ( + + ); + }, +}); diff --git a/web/src/materials/questions/widgets/BinaryChoiceModule/meta.js b/web/src/materials/questions/widgets/BinaryChoiceModule/meta.js new file mode 100644 index 00000000..75b2353d --- /dev/null +++ b/web/src/materials/questions/widgets/BinaryChoiceModule/meta.js @@ -0,0 +1,51 @@ +import basicConfig from '../../common/config/basicConfig'; + +const meta = { + title: '判断题', + type: 'binary-choice', + componentName: 'BinaryChoiceModule', + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title', + // }, + basicConfig, + ], + editConfigure: { + optionEdit: { + show: false, + }, + optionEditBar: { + show: false, + configure: { + showOthers: false, + showAdvancedConfig: false, + }, + }, + }, +}; + +export default meta; diff --git a/web/src/materials/questions/widgets/CheckboxModule/index.jsx b/web/src/materials/questions/widgets/CheckboxModule/index.jsx new file mode 100644 index 00000000..24b8645c --- /dev/null +++ b/web/src/materials/questions/widgets/CheckboxModule/index.jsx @@ -0,0 +1,119 @@ +import baseChoice from '../BaseChoice'; +import { computed, defineComponent } from 'vue'; +import QuestionWithRule from '@/materials/questions/widgets/QuestionRuleContainer'; +import { includes } from 'lodash'; +import metaConfig from './meta.js'; +export const meta = metaConfig; +/** + * 支持配置: + * 排列方式, layout + */ +export default defineComponent({ + name: 'CheckBoxModule', + components: { baseChoice, QuestionWithRule }, + props: { + type: { + type: String, + default: '', + }, + field: { + type: String, + default: '', + }, + value: { + type: Array, + default: () => { + return []; + }, + }, + layout: { + type: String, + default: 'vertical', + }, + options: { + type: Array, + default: () => [], + }, + readonly: { + type: Boolean, + default: false, + }, + maxNum: { + type: [Number, String], + default: 1, + }, + }, + setup(props, { emit }) { + const disableState = computed(() => { + if (!props.maxNum) { + return false; + } + return props.value.length >= +props.maxNum; + }); + const isDisabled = (item) => { + const { value } = props; + return disableState.value && !includes(value, item.value); + }; + const myOptions = computed(() => { + const { options } = props; + return options.map((item) => { + return { + ...item, + disabled: isDisabled(item), + }; + }); + }); + const onChange = (value) => { + const key = props.field; + emit('change', { + key, + value, + }); + }; + const handleSelectMoreChange = (data) => { + const { key, value } = data; + emit('change', { + key, + value, + }); + }; + return { + onChange, + handleSelectMoreChange, + myOptions, + }; + }, + render() { + const { readonly, field, myOptions } = this; + + const props = { + ...this.$props, + readonly, + name: field, + options: myOptions, + }; + return ( + { + return ( + this.handleSelectMoreChange(e)} + > + ); + }, + }} + > + ); + }, +}); diff --git a/web/src/materials/questions/widgets/CheckboxModule/meta.js b/web/src/materials/questions/widgets/CheckboxModule/meta.js new file mode 100644 index 00000000..2a248681 --- /dev/null +++ b/web/src/materials/questions/widgets/CheckboxModule/meta.js @@ -0,0 +1,195 @@ +import basicConfig from '../../common/config/basicConfig'; + +const meta = { + title: '多选', + questExtra: ['listenMerge'], + type: 'checkbox', + componentName: 'CheckBoxModule', + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title', + // }, + basicConfig, + // { + // name: 'optionOrigin', + // label: '选项引用其他题目选项', + // type: 'Select', + // options: [], + // key: 'optionOrigin', + // tip: '支持引用多选题、单选题、矩阵单选题', + // }, + // { + // name: 'originType', + // label: '', + // type: 'Select', + // options: [ + // { + // label: '选中项', + // value: 'selected', + // }, + // { + // label: '未选中项', + // value: 'noSelected', + // }, + // ], + // key: 'originType', + // }, + // { + // name: 'optionsExtra', + // label: '固定选项配置', + // type: 'Options', + // options: [], + // keys: 'extraOptions', + // hidden: true, + // }, + { + name: 'optionConfig', + label: '选项配置', + type: 'Customed', + key: 'optionConfig', + labelStyle: { + 'font-weight': 'bold', + }, + content: [ + // { + // label: '选项随机排序', + // type: 'CheckBox', + // key: 'randomSort', + // direction: 'horizon', + // value: false, + // contentPosition: 'before', + // contentClass: 'check-box-config', + // }, + // { + // label: '固定最后一个选项', + // type: 'CustomedSwitch', + // key: 'pinLastOption', + // direction: 'horizon', + // value: false, + // exclude: ['combination'], + // contentClass: 'check-box-config', + // tip: '开关开启后,本题的最后一个选项不参与随机,位置固定显示在最后', + // }, + // { + // label: '默认选中第一项', + // type: 'CheckBox', + // key: 'checked', + // direction: 'horizon', + // value: false, + // contentPosition: 'before', + // contentClass: 'check-box-config', + // }, + // { + // label: '展示选项余量', + // type: 'CheckBox', + // key: 'showLeftNum', + // direction: 'horizon', + // value: true, + // include: ['appointment'], + // contentPosition: 'before', + // contentClass: 'check-box-config', + // }, + // { + // label: '切换题型', + // type: 'Radio', + // key: 'selectType', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '单选', + // value: 'radio', + // }, + // { + // label: '多选', + // value: 'checkbox', + // }, + // ], + // contentClass: 'radio-config', + // }, + // { + // label: '排列方式', + // type: 'Radio', + // key: 'sortWay', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '竖排', + // value: 'v', + // }, + // { + // label: '横排', + // value: 'h', + // }, + // ], + // contentClass: 'radio-config', + // }, + { + label: '至少选择数', + type: 'InputNumber', + key: 'minNum', + direction: 'horizon', + value: '', + min: 0, + max: 'maxNum', + contentClass: 'input-number-config', + }, + { + label: '最多选择数', + type: 'InputNumber', + key: 'maxNum', + direction: 'horizon', + value: '', + min: 'minNum', + contentClass: 'input-number-config', + }, + ], + }, + // { + // name: 'randomCheckbox', + // label: '随机单个选项显示关联题目', + // type: 'CustomedSwitch', + // direction: 'horizon', + // key: 'randomCheckbox', + // }, + ], + editConfigure: { + optionEdit: { + show: true, + }, + optionEditBar: { + show: true, + configure: { + showOthers: true, + showAdvancedConfig: true, + }, + }, + }, +}; + +export default meta; diff --git a/web/src/materials/questions/widgets/EditOptions.jsx b/web/src/materials/questions/widgets/EditOptions.jsx new file mode 100644 index 00000000..9bc39c08 --- /dev/null +++ b/web/src/materials/questions/widgets/EditOptions.jsx @@ -0,0 +1,156 @@ +import { defineComponent, ref, computed, onMounted } from 'vue'; +import OptionEdit from '@/materials/questions/components/Options/OptionEdit.vue'; +import OptionEditBar from '@/materials/questions/components/Options/OptionEditBar.vue'; +import store from '@/management/store'; +import questionLoader from '@/materials/questions/questionLoader'; +import UseOptionBase from '@/materials/questions/components/Options/UseOptionBase'; + +export default defineComponent({ + name: 'EditOptions', + components: { + OptionEdit, + OptionEditBar, + }, + provide() { + return { + currentEditKey: store.getters['edit/currentEditKey'], + moduleConfig: this.moduleConfig, + }; + }, + props: { + moduleConfig: { + type: Object, + required: true, + }, + }, + setup(props) { + const questionDataList = computed(() => { + return store.state.schema.questionDataList; + }); + const currentEditOne = computed(() => { + return store.state?.edit?.currentEditOne; + }); + const currentEditKey = computed(() => { + return store.getters['edit/currentEditKey']; + }); + const getOptions = computed(() => { + return props.moduleConfig.options; + }); + const { addOption, addOtherOption } = UseOptionBase(getOptions); + const handleAddOption = ( + text = '选项', + others = false, + index = -1, + field + ) => { + const value = addOption(text, others, index, field); + handleOptionChange(value); + }; + const handleAddOtherOption = () => { + const { field } = props.moduleConfig; + const value = addOtherOption(field); + handleOptionChange(value); + }; + + const handleOptionChange = (value) => { + const optionKey = `options`; + const key = `${currentEditKey.value}.${optionKey}`; + handleChange({ key, value }); + }; + + const handleChange = ({ key, value }) => { + store.dispatch('edit/changeSchema', { key, value }); + }; + // const questionMeta = ref({}) + const isShowOptionConfig = ref(false); + const hasAdvancedConfig = ref(false); + const hasAdvancedRateConfig = ref(false); + const showOthers = ref(false); + const showOptionEdit = ref(false); + const showOptionEditBar = ref(true); + onMounted(() => { + const questionMeta = questionLoader.getMeta(props.moduleConfig.type); + const { editConfigure } = questionMeta; + + if (editConfigure) { + showOptionEdit.value = editConfigure.optionEdit.show; + const { optionEditBar } = editConfigure; + showOptionEditBar.value = optionEditBar.show; + showOthers.value = optionEditBar.configure.showOthers; + hasAdvancedConfig.value = Boolean( + optionEditBar.configure.showAdvancedConfig + ); + hasAdvancedRateConfig.value = Boolean( + optionEditBar.configure.showAdvancedRateConfig + ); + } else { + // meta不存在的兜底程序 + if ( + ['radio-star', 'text', 'textarea'].includes(props.moduleConfig.type) + ) { + showOptionEdit.value = false; + } else { + showOptionEdit.value = true; + } + if (['radio-star'].includes(props.moduleConfig.type)) { + showOthers.value = false; + } else { + showOthers.value = true; + } + if (['binary-choice'].includes(props.moduleConfig.type)) { + showOptionEditBar.value = false; + } + if (!['radio-star'].includes(props.moduleConfig.type)) { + hasAdvancedConfig.value = true; + } else { + hasAdvancedRateConfig.value = true; + } + } + }); + return { + questionDataList, + currentEditOne, + currentEditKey, + getOptions, + isShowOptionConfig, + hasAdvancedConfig, + hasAdvancedRateConfig, + showOptionEdit, + showOptionEditBar, + showOthers, + handleAddOption, + handleAddOtherOption, + handleOptionChange, + handleChange, + }; + }, + render() { + return ( +
+ {this.showOptionEdit ? ( + + ) : ( + this.$slots.default + )} + {this.showOptionEditBar && ( + + )} +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/InputModule/index.jsx b/web/src/materials/questions/widgets/InputModule/index.jsx new file mode 100644 index 00000000..dddf22a1 --- /dev/null +++ b/web/src/materials/questions/widgets/InputModule/index.jsx @@ -0,0 +1,136 @@ +import baseInput from '../BaseInput'; +import { defineComponent, ref } from 'vue'; +import '../../common/css/input.scss'; +import { get } from 'lodash'; +import myMeta from './meta'; +export const meta = myMeta; +/** + * 支持配置: + * 内容限制格式,valid + * 字数限制,textRange + * 引导提示文案,placeholder + */ +export default defineComponent({ + name: 'InputModule', + components: { baseInput }, + props: { + type: { + type: String, + default: '', + }, + field: { + type: String, + default: '', + }, + value: { + type: String, + default: '', + }, + placeholder: { + type: String, + default: '请填写', + }, + textRange: { + type: Object, + default: () => { + return { + max: { + placeholder: '500', + value: 500, + }, + min: { + placeholder: '0', + value: 0, + }, + }; + }, + }, + valid: { + type: String, + default: '', + }, + readonly: { + type: Boolean, + default: false, + }, + }, + setup(props, { emit }) { + const focusFlag = ref(false); + const initial = props.textRange.max.value - props.value.length; + const getLeftTextNumber = ref(initial); + const onBlur = () => { + emit('blur'); + }; + const onFocus = () => { + if (props.type !== 'mob' && (props.valid === '' || props.valid === 'n')) { + focusFlag.value = true; + } + emit('focus'); + }; + const onInput = (e) => { + if (props.type !== 'mob' && (props.valid === '' || props.valid === 'n')) { + getLeftTextNumber.value = + props.textRange.max.value - e.target.value.length; + } + emit('input'); + }; + const onChange = (e) => { + const key = props.field; + const maxLength = get(props, 'textRange.max.value'); + if ( + get(props, 'valid') === 'n' && + maxLength && + e.target.value.toString().length > maxLength + ) { + e.target.value = e.target.value.slice(0, props.textRange.max.value); + } + if (['m', 'idcard', 'e', 'licensePlate'].includes(props.valid)) { + e.target.value = e.target.value.replace(/\s+/g, ''); + } + emit('change', { + key, + value: e.target.value, + }); + }; + return { + focusFlag, + getLeftTextNumber, + onBlur, + onFocus, + onInput, + onChange, + }; + }, + render() { + const { readonly, focusFlag, getLeftTextNumber, field, valid, textRange } = + this; + const props = { + ...this.$props, + readonly, + name: field, + type: valid === 'n' ? 'number' : 'text', + maxlength: textRange.max.value, + minlength: textRange.min.value, + }; + return ( + + {focusFlag && ( +
+

{getLeftTextNumber}

+
+ )} +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/InputModule/meta.js b/web/src/materials/questions/widgets/InputModule/meta.js new file mode 100644 index 00000000..95d83fd2 --- /dev/null +++ b/web/src/materials/questions/widgets/InputModule/meta.js @@ -0,0 +1,157 @@ +import basicConfig from '../../common/config/basicConfig'; + +export const meta = { + title: '单行输入框', + questExtra: ['listenMerge'], + type: 'text', + componentName: 'InputModule', + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title', + // }, + basicConfig, + { + name: 'valid', + label: '内容限制格式', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Select', + key: 'valid', + options: [ + { + label: '请选择', + value: '', + }, + { + label: '手机号', + value: 'm', + }, + { + label: '身份证', + value: 'idcard', + }, + { + label: '数字', + value: 'n', + }, + { + label: '邮箱', + value: 'e', + }, + { + label: '车牌号', + value: 'licensePlate', + }, + ], + }, + // { + // name: 'qQuestionLimit', + // label: '相同填写内容提交次数', + // type: 'QuestionLimit', + // key: 'qQuestionLimit', + // value: { + // type: 0, + // limit: 0, + // }, + // }, + { + name: 'numberRange', + label: '数字限制', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Range', + options: [], + key: 'numberRange', + value: [], + cleanKeys: { + numberRange: { + min: { + placeholder: '0', + value: 0, + }, + max: { + placeholder: '1000', + value: 1000, + }, + }, + }, + relyFunc: (data) => data.valid && data.valid === 'n', + }, + { + name: 'textRange', + label: '字数限制', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Range', + options: [], + key: 'textRange', + value: [], + }, + // { + // name: 'inputType', + // label: '切换题型', + // type: 'Radio', + // key: 'type', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '单行', + // value: 'text', + // }, + // { + // label: '多行', + // value: 'textarea', + // }, + // ], + // contentClass: 'radio-config', + // }, + { + name: 'placeholder', + label: '引导提示文案', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Input', + placeholder: '限制20字', + key: 'placeholder', + tip: '限制20字', + validate(value) { + if (value && value.length > 20) { + console.warn('引导提示文案字数不能超过20个字,请修改后重新保存'); + return false; + } + return true; + }, + }, + ], +}; + +export default meta; diff --git a/web/src/materials/questions/widgets/QuestionContainer.jsx b/web/src/materials/questions/widgets/QuestionContainer.jsx new file mode 100644 index 00000000..a60a2282 --- /dev/null +++ b/web/src/materials/questions/widgets/QuestionContainer.jsx @@ -0,0 +1,168 @@ +import { computed, defineComponent, onMounted, ref } from 'vue'; +import moduleTitle from './Title.jsx'; +import EditOptions from './EditOptions.jsx'; +import moduleList from '../common/config/moduleList.js'; +import '../common/css/question.scss'; + +import questionLoader from '@/materials/questions/questionLoader.js'; +import '../common/css/title.scss'; + +export const getBlockComponent = async (type) => { + const path = moduleList[type]; + const component = await questionLoader.loadComponent(type, path); + + return component; +}; + +export default defineComponent({ + name: 'QuestionContainer', + props: { + type: { + type: String, + default: 'text', + }, + showTitle: { + type: Boolean, + default: true, + }, + indexNumber: { + type: [Number, String], + default: 1, + }, + moduleConfig: { + type: Object, + default: () => { + return { + field: 'quiestion01', + type: 'text', + component: 'InputModule', + title: '标题1单行输入框', + value: '123444', + showType: 'text', + placeholder: '请填写', + textRange: { + max: { + placeholder: '500', + value: 500, + }, + min: { + placeholder: '0', + value: 0, + }, + }, + valid: 'n', + }; + }, + }, + readonly: { + type: Boolean, + default: false, + }, + isSelected: { + type: Boolean, + default: false, + }, + }, + components: { + moduleTitle, + }, + setup(props, { emit }) { + const blockComponent = ref(null); + const showEditCom = computed(() => { + let result = false; + if (props.isSelected) { + if (!['text', 'textarea'].includes(props.type)) { + result = true; + } + } + return result; + }); + + // const isSelected = ref(false) + onMounted(async () => { + const { component } = await getBlockComponent(props.type); + blockComponent.value = component; + }); + const onBlur = () => { + emit('blur'); + }; + const onFoucs = () => { + emit('focus'); + }; + const onChange = (data) => { + emit('change', data); + }; + const onClick = () => { + emit('select', props.indexNumber); + }; + return { + // isSelected, + blockComponent, + onClick, + onBlur, + onFoucs, + onChange, + showEditCom, + // showOthers + }; + }, + render(h) { + const { readonly, isSelected } = this; + + const props = { + isSelected, + ...this.moduleConfig, + ...this.$props, + }; + return ( +
+ {this.showTitle && ( + + )} +
+ {this.showEditCom + ? h( + EditOptions, + { + props: { + moduleConfig: this.moduleConfig, + }, + }, + [ + h( + this.blockComponent, + { + props: { + readonly, + ...props, + }, + on: { + blur: this.onBlur, + focus: this.onFoucs, + change: this.onChange, + }, + }, + [] + ), + ] + ) + : h( + this.blockComponent, + { + props: { + readonly, + ...props, + }, + on: { + blur: this.onBlur, + focus: this.onFoucs, + change: this.onChange, + }, + }, + [] + )} +
+
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/QuestionRuleContainer.jsx b/web/src/materials/questions/widgets/QuestionRuleContainer.jsx new file mode 100644 index 00000000..2b802861 --- /dev/null +++ b/web/src/materials/questions/widgets/QuestionRuleContainer.jsx @@ -0,0 +1,193 @@ +import '../common/css/formItem.scss'; +import Vue, { + defineComponent, + getCurrentInstance, + ref, + nextTick, + computed, + inject, + onMounted, + onBeforeUnmount, +} from 'vue'; +import QuestionContainer from '@/materials/questions/widgets/QuestionContainer.jsx'; +import ErrorTip from '../components/ErrorTip.vue'; +import { assign } from 'lodash'; +import AsyncValidator from 'async-validator'; +export default defineComponent({ + name: 'QuestionRuleContainer', + components: { ErrorTip }, + props: { + readonly: Boolean, + showTitle: Boolean, + moduleConfig: { + type: Object, + default: () => { + return {}; + }, + }, + showSpliter: { + type: Boolean, + default: false, + }, + indexNumber: { + type: [Number, String], + default: 1, + }, + }, + setup(props, { emit }) { + const validateMessage = ref(''); + const validateState = ref(''); + const { proxy: instance } = getCurrentInstance(); + + const itemClass = computed(() => { + const classList = []; + classList.push(props.moduleConfig.direction); + const type = props.moduleConfig.type; + if (type) { + if (type === 'section') { + classList.push('question-type-section'); + } + // if (includes(['radio', 'checkbox', 'vote', 'radio-star', 'binary-choice'], type)) { + // classList.push('special') + // } + + if (type === 'scroll') { + classList.push('no-padding'); + } + if (type === 'user-agreement') { + classList.push('no-out-padding'); + } + } + return classList.join(' '); + }); + const form = inject('Form', { + default: {}, + type: Object, + }); + const show = computed(() => { + const { type } = props.moduleConfig; + return !/hidden|mobileHidden/.test(type); + }); + onMounted(() => { + form.$emit && form.$emit('form.addField', instance); + }); + onBeforeUnmount(() => { + form.$emit && form.$emit('form.removeField', instance); + }); + const validate = (trigger, callback = () => {}) => { + const rules = getFilteredRule(trigger); + if (!rules || rules.length === 0) { + callback && callback(); + return true; + } + + const { field, options } = props.moduleConfig; + + const descriptor = {}; + if (rules && rules.length > 0) { + rules.forEach((rule) => { + // eslint-disable-next-line no-param-reassign + delete rule.trigger; + }); + } + // 有选项的题才需要判断这步,如果没有选项,就不校验,如果有,就要校验 + if (options && options.length) { + const trueOptions = options.filter((i) => !i.hide); + if (trueOptions.length === 0) { + callback && callback(); + return true; + } + } + + descriptor[field] = rules; + const validator = new AsyncValidator(descriptor); + // 因为有些input的value是bind上去的,所以应该在下一帧再去校验,否则会出现第一次blur没反应 + nextTick(() => { + // 对填空题单独设置其value + let value = form.model[field]; + validator.validate( + { [field]: value }, + { firstFields: true }, + (errors) => { + validateState.value = !errors ? 'success' : 'error'; + validateMessage.value = errors ? errors[0].message : ''; + callback && callback(validateMessage.value); + } + ); + }); + }; + const onFieldBlur = () => { + if (!(form && form instanceof Vue)) return; + validate('blur'); + }; + // eslint-disable-next-line no-unused-vars + const onFieldChange = () => { + if (!(form && form instanceof Vue)) return; + validate('change'); + }; + const getRules = () => { + const { rules } = form; + const { field } = props.moduleConfig; + return rules[field]; + }; + const getFilteredRule = (trigger) => { + let rules = getRules(); + if (!rules) { + rules = []; + } + return rules + .filter((rule) => !rule.trigger || rule.trigger.indexOf(trigger) !== -1) + .map((rule) => assign({}, rule)); + }; + const handleBlur = () => { + emit('blur'); + onFieldBlur(); + }; + const handleChange = (data) => { + emit('change', data); + onFieldChange(); + }; + return { + validateMessage, + validate, + itemClass, + show, + onFieldBlur, + onFieldChange, + getRules, + getFilteredRule, + handleBlur, + handleChange, + }; + }, + render(h) { + const { itemClass, validateMessage } = this; + return ( +
+ {h(QuestionContainer, { + props: { + type: this.moduleConfig.type, + moduleConfig: this.moduleConfig, + value: this.moduleConfig.value, + indexNumber: this.indexNumber, + showTitle: this.showTitle, + readonly: this.readonly, + }, + on: { + ...this.$listeners, + blur: this.handleBlur, + change: this.handleChange, + }, + })} + +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/RadioModule/index.jsx b/web/src/materials/questions/widgets/RadioModule/index.jsx new file mode 100644 index 00000000..5b5e9f76 --- /dev/null +++ b/web/src/materials/questions/widgets/RadioModule/index.jsx @@ -0,0 +1,107 @@ +import baseChoice from '../BaseChoice'; +import { defineComponent } from 'vue'; +import QuestionWithRule from '@/materials/questions/widgets/QuestionRuleContainer'; + +/** + * 支持配置: + * 排列方式, layout + */ +export default defineComponent({ + name: 'RadioModule', + components: { baseChoice, QuestionWithRule }, + props: { + type: { + type: String, + default: '', + }, + field: { + type: String, + default: '', + }, + value: { + type: String, + default: '', + }, + layout: { + type: String, + default: 'vertical', + }, + options: { + type: Array, + default: () => [], + }, + readonly: { + type: Boolean, + default: false, + }, + // moduleConfig: { + // type: Object, + // default: () => { + // return { + // field: 'quiestion01', + // component: 'RadioModule', + // options: [{ + // text: '选项2', + // hash: 'item1' + // }, { + // text: '选项2', + // hash: 'item2' + // }] + // } + // } + // } + }, + setup(props, { emit }) { + const onChange = (value) => { + const key = props.field; + emit('change', { + key, + value, + }); + }; + const handleSelectMoreChange = (data) => { + const { key, value } = data; + emit('change', { + key, + value, + }); + }; + return { + onChange, + handleSelectMoreChange, + }; + }, + render() { + const { readonly, field } = this; + const props = { + ...this.$props, + readonly, + name: field, + }; + return ( +
+ { + return ( + this.handleSelectMoreChange(e)} + > + ); + }, + }} + > +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/RadioModule/meta.js b/web/src/materials/questions/widgets/RadioModule/meta.js new file mode 100644 index 00000000..045c51fb --- /dev/null +++ b/web/src/materials/questions/widgets/RadioModule/meta.js @@ -0,0 +1,208 @@ +import basicConfig from '../../common/config/basicConfig'; + +const meta = { + title: '单选', + questExtra: ['listenMerge'], + type: 'radio', + props: [ + { + name: 'title', + propType: 'String', + description: '这是用于描述题目标题', + defaultValue: '标题一', + }, + { + name: 'type', + propType: 'String', + description: '这是用于描述题目类型', + defaultValue: '标题一', + }, + { + name: 'extraOptions', + propType: Array, + description: '这是用于固定选项配置', + defaultValue: [], + }, + ], + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true, + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title', + // }, + basicConfig, + // { + // name: 'optionOrigin', + // label: '选项引用其他题目选项', + // type: 'Select', + // options: [], + // key: 'optionOrigin', + // tip: '支持引用多选题、单选题、矩阵单选题', + // }, + // { + // name: 'originType', + // label: '', + // type: 'Select', + // options: [ + // { + // label: '选中项', + // value: 'selected', + // }, + // { + // label: '未选中项', + // value: 'noSelected', + // }, + // ], + // key: 'originType', + // }, + { + name: 'optionsExtra', + label: '固定选项配置', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Options', + options: [], + keys: 'extraOptions', + hidden: true, + }, + // { + // name: 'optionConfig', + // label: '选项配置', + // type: 'Customed', + // key: 'optionConfig', + // content: [ + // { + // label: '选项随机排序', + // type: 'CheckBox', + // key: 'randomSort', + // direction: 'horizon', + // value: false, + // contentPosition: 'before', + // contentClass: 'check-box-config', + // }, + // { + // label: '固定最后一个选项', + // type: 'CustomedSwitch', + // key: 'pinLastOption', + // direction: 'horizon', + // value: false, + // exclude: ['combination'], + // contentClass: 'check-box-config', + // tip: '开关开启后,本题的最后一个选项不参与随机,位置固定显示在最后', + // }, + // { + // label: '默认选中第一项', + // type: 'CheckBox', + // key: 'checked', + // direction: 'horizon', + // value: false, + // contentPosition: 'before', + // contentClass: 'check-box-config', + // }, + // { + // label: '展示选项余量', + // type: 'CheckBox', + // key: 'showLeftNum', + // direction: 'horizon', + // value: true, + // include: ['appointment'], + // contentPosition: 'before', + // contentClass: 'check-box-config', + // }, + // { + // name: 'inputType', + // label: '切换题型', + // type: 'Radio', + // key: 'selectType', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '单选', + // value: 'radio', + // }, + // { + // label: '多选', + // value: 'checkbox', + // }, + // ], + // contentClass: 'radio-config', + // }, + // { + // label: '排列方式', + // type: 'Radio', + // key: 'sortWay', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '竖排', + // value: 'v', + // }, + // { + // label: '横排', + // value: 'h', + // }, + // ], + // contentClass: 'radio-config', + // }, + // { + // label: '至少选择数', + // type: 'InputNumber', + // key: 'minNum', + // direction: 'horizon', + // value: '', + // min: 0, + // max: 'maxNum', + // contentClass: 'input-number-config', + // }, + // { + // label: '最多选择数', + // type: 'InputNumber', + // key: 'maxNum', + // direction: 'horizon', + // value: '', + // min: 'minNum', + // contentClass: 'input-number-config', + // }, + // ], + // }, + ], + editConfigure: { + optionEdit: { + show: true, + }, + optionEditBar: { + show: true, + configure: { + showOthers: true, + showAdvancedConfig: true, + }, + }, + }, +}; + +export default meta; diff --git a/web/src/materials/questions/widgets/SelectMoreModule/index.jsx b/web/src/materials/questions/widgets/SelectMoreModule/index.jsx new file mode 100644 index 00000000..2ee24264 --- /dev/null +++ b/web/src/materials/questions/widgets/SelectMoreModule/index.jsx @@ -0,0 +1,51 @@ +import { defineComponent } from 'vue'; +import baseInput from '../BaseInput'; + +export default defineComponent({ + name: 'SelectMoreData', + components: { baseInput }, + props: { + readonly: Boolean, + field: String, + placeholder: String, + value: String, + }, + setup(props, { emit }) { + // const moduleConfig = ref({ + // type: 'text' + // }) + const onBlur = () => { + emit('blur'); + }; + const onChange = (e) => { + const key = props.field; + const value = e.target.value; + emit('change', { + key, + value, + }); + }; + return { + // moduleConfig, + onBlur, + onChange, + }; + }, + render() { + return ( + + ); + }, +}); diff --git a/web/src/materials/questions/widgets/SelectMoreModule/meta.js b/web/src/materials/questions/widgets/SelectMoreModule/meta.js new file mode 100644 index 00000000..e69de29b diff --git a/web/src/materials/questions/widgets/StarModule/index.jsx b/web/src/materials/questions/widgets/StarModule/index.jsx new file mode 100644 index 00000000..5ac81b93 --- /dev/null +++ b/web/src/materials/questions/widgets/StarModule/index.jsx @@ -0,0 +1,137 @@ +import { defineComponent, computed } from 'vue'; +import '../../common/css/radioStar.scss'; +import BaseRate from '../BaseRate'; +import QuestionWithRule from '@/materials/questions/widgets/QuestionRuleContainer'; +export default defineComponent({ + name: 'StarModule', + components: { BaseRate, QuestionWithRule }, + props: { + type: { + type: String, + default: '', + }, + field: { + type: String, + default: '', + }, + value: { + type: [String, Number], + default: 0, + }, + starMin: { + type: Number, + default: 1, + }, + starMax: { + type: Number, + default: 5, + }, + starStyle: { + type: String, + default: 'star', + }, + readonly: { + type: Boolean, + default: false, + }, + rangeConfig: { + type: Object, + default: () => { + return {}; + }, + }, + }, + setup(props, { emit }) { + const rating = computed({ + get() { + return props.value; + }, + set(val) { + const key = props.field; + emit('change', { + key, + value: val, + }); + }, + }); + const currentRangeConfig = computed(() => { + return props.rangeConfig[rating.value]; + }); + const isShowInput = computed(() => { + return currentRangeConfig.value?.isShowInput; + }); + const starClass = computed(() => { + const { starStyle } = props; + switch (starStyle) { + case 'star': + return 'qicon qicon-xingxing'; + case 'love': + return 'qicon qicon-aixin'; + case 'number': + return 'number'; + default: + return 'qicon qicon-xingxing'; + } + }); + const confirmStar = (num) => { + if (props.readonly) return; + rating.value = num; + }; + + const onMoreDataChange = (data) => { + const { key, value } = data; + emit('change', { + key, + value, + }); + }; + return { + rating, + currentRangeConfig, + starClass, + isShowInput, + confirmStar, + onMoreDataChange, + }; + }, + render() { + const { + field, + value, + rating, + readonly, + starClass, + currentRangeConfig, + isShowInput, + onMoreDataChange, + rangeConfig, + } = this; + + return ( +
+ + {currentRangeConfig && ( +

{currentRangeConfig.explain}

+ )} + {isShowInput && ( + onMoreDataChange(e)} + > + )} +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/StarModule/meta.js b/web/src/materials/questions/widgets/StarModule/meta.js new file mode 100644 index 00000000..19c20702 --- /dev/null +++ b/web/src/materials/questions/widgets/StarModule/meta.js @@ -0,0 +1,118 @@ +import basicConfig from '../../common/config/basicConfig'; + +const meta = { + title: '评分', + questExtra: ['listenMerge'], + type: 'radio-star', + componentName: 'StarModule', + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title' + // }, + basicConfig, + { + name: 'starConfig', + label: '评分显示样式', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'RadioGroup', + key: 'starStyle', + options: [ + { + label: [1, 2, 3, 4, 5] + .map( + () => + `` + ) + .join(''), + value: 'star', + }, + { + label: [1, 2, 3, 4, 5] + .map( + () => + `` + ) + .join(''), + value: 'love', + }, + { + label: `1 2 3 4 5`, + value: 'number', + }, + ], + }, + // { + // name: 'starMin', + // label: '评分最小值', + // type: 'InputNumber', + // key: 'starMin', + // direction: 'horizon', + // value: '', + // min: data => Math.max(data.starMax - 10, -10), + // max: 'starMax', + // relyFunc: data => data.starStyle === 'number', + // }, + // { + // name: 'starMax', + // label: '评分最大值', + // type: 'InputNumber', + // key: 'starMax', + // direction: 'horizon', + // value: '', + // min: 'starMin', + // max: data => Math.min(data.starMin + 10, 10), + // relyFunc: data => data.starStyle === 'number', + // }, + // { + // name: 'starMaxSingle', + // label: '评分最大值', + // type: 'InputNumber', + // key: 'starMax', + // direction: 'horizon', + // value: 5, + // min: 1, + // max: 10, + // relyFunc: data => data.starStyle !== 'number', + // }, + ], + editConfigure: { + optionEdit: { + show: false, + }, + optionEditBar: { + show: true, + configure: { + showOthers: false, + showAdvancedRateConfig: true, + }, + }, + }, +}; + +export default meta; diff --git a/web/src/materials/questions/widgets/TextareaModule/index.jsx b/web/src/materials/questions/widgets/TextareaModule/index.jsx new file mode 100644 index 00000000..2ecd5754 --- /dev/null +++ b/web/src/materials/questions/widgets/TextareaModule/index.jsx @@ -0,0 +1,130 @@ +import baseInput from '../BaseInput'; +import { defineComponent, ref } from 'vue'; +import '../../common/css/input.scss'; +import { get } from 'lodash'; +import myMeta from './meta'; +export const meta = myMeta; +/** + * 支持配置: + * 内容限制格式,valid + * 字数限制,textRange + * 引导提示文案,placeholder + */ +export default defineComponent({ + name: 'TextareaModule', + components: { baseInput }, + props: { + type: {}, + field: {}, + value: { + type: String, + default: '', + }, + placeholder: { + type: String, + default: '请填写', + }, + textRange: { + type: Object, + default: () => { + return { + max: { + placeholder: '500', + value: 500, + }, + min: { + placeholder: '0', + value: 0, + }, + }; + }, + }, + valid: { + type: String, + default: '', + }, + readonly: { + type: Boolean, + default: false, + }, + }, + setup(props, { emit }) { + const focusFlag = ref(false); + const initial = props.textRange.max.value - props.value.length; + const getLeftTextNumber = ref(initial); + const onFocus = () => { + if (props.readonly) return; + if (props.type !== 'mob' && (props.valid === '' || props.valid === 'n')) { + focusFlag.value = true; + } + emit('focus'); + }; + const onBlur = () => { + emit('blur'); + }; + const onInput = (e) => { + if (props.type !== 'mob' && (props.valid === '' || props.valid === 'n')) { + getLeftTextNumber.value = + props.textRange.max.value - e.target.value.length; + } + emit('input'); + }; + const onChange = (e) => { + const key = props.field; + const maxLength = get(props, 'textRange.max.value'); + if ( + get(props, 'valid') === 'n' && + maxLength && + e.target.value.toString().length > maxLength + ) { + e.target.value = e.target.value.slice(0, props.textRange.max.value); + } + if (['m', 'idcard', 'e', 'licensePlate'].includes(props.valid)) { + e.target.value = e.target.value.replace(/\s+/g, ''); + } + emit('change', { + key, + value: e.target.value, + }); + }; + return { + focusFlag, + getLeftTextNumber, + onBlur, + onFocus, + onInput, + onChange, + }; + }, + render() { + const { focusFlag, getLeftTextNumber, field, textRange } = this; + const props = { + ...this.$props, + value: this.value, + name: field, + maxlength: textRange.max.value, + minlength: textRange.min.value, + }; + return ( + + {focusFlag && ( +
+

{getLeftTextNumber}

+
+ )} +
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/TextareaModule/meta.js b/web/src/materials/questions/widgets/TextareaModule/meta.js new file mode 100644 index 00000000..6a95858a --- /dev/null +++ b/web/src/materials/questions/widgets/TextareaModule/meta.js @@ -0,0 +1,154 @@ +import basicConfig from '../../common/config/basicConfig'; + +const meta = { + title: '多行输入框', + type: 'textarea', + componentName: 'TextareaModule', + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title' + // }, + basicConfig, + { + name: 'valid', + label: '内容限制格式', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Select', + key: 'valid', + options: [ + { + label: '请选择', + value: '', + }, + { + label: '手机号', + value: 'm', + }, + { + label: '身份证', + value: 'idcard', + }, + { + label: '数字', + value: 'n', + }, + { + label: '邮箱', + value: 'e', + }, + { + label: '车牌号', + value: 'licensePlate', + }, + ], + }, + // { + // name: 'qQuestionLimit', + // label: '相同填写内容提交次数', + // type: 'QuestionLimit', + // key: 'qQuestionLimit', + // value: { + // type: 0, + // limit: 0 + // } + // }, + { + name: 'numberRange', + label: '数字限制', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Range', + options: [], + key: 'numberRange', + value: [], + cleanKeys: { + numberRange: { + min: { + placeholder: '0', + value: 0, + }, + max: { + placeholder: '1000', + value: 1000, + }, + }, + }, + relyFunc: (data) => data.valid && data.valid === 'n', + }, + { + name: 'textRange', + label: '字数限制', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Range', + options: [], + key: 'textRange', + value: [], + }, + // { + // name: 'inputType', + // label: '切换题型', + // type: 'Radio', + // key: 'type', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '单行', + // value: 'text' + // }, + // { + // label: '多行', + // value: 'textarea' + // } + // ], + // contentClass: 'radio-config' + // }, + { + name: 'placeholder', + label: '引导提示文案', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Input', + placeholder: '限制20字', + key: 'placeholder', + tip: '限制20字', + validate(value) { + if (value && value.length > 20) { + return false; + } + return true; + }, + }, + ], +}; +export default meta; diff --git a/web/src/materials/questions/widgets/Title.jsx b/web/src/materials/questions/widgets/Title.jsx new file mode 100644 index 00000000..cefa5568 --- /dev/null +++ b/web/src/materials/questions/widgets/Title.jsx @@ -0,0 +1,127 @@ +import { defineComponent, ref, computed, watch } from 'vue'; +import { filterXSS } from '@/common/xss'; +import '../common/css/title.scss'; +import tagList from '../common/config/tagList'; +import richEditor from '@/common/Editor/RichEditor'; + +export default defineComponent({ + name: 'ModuleTitle', + components: { richEditor }, + props: { + isSelected: { + type: Boolean, + default: false, + }, + showIndex: { + type: Boolean, + default: false, + }, + indexNumber: { + type: [Number, String], + default: '', + }, + isRequired: { + type: Boolean, + default: true, + }, + title: { + type: String, + default: '标题', + }, + showType: { + type: Boolean, + default: false, + }, + type: { + type: String, + default: '', + }, + }, + setup(props, { emit }) { + const status = ref(''); + watch( + () => props.isSelected, + () => { + status.value = 'preview'; + } + ); + const typeName = computed(() => { + if (!props.showType) return ''; + const types = props.showType ? [props.type] : []; + if (!types || !types.length) return ''; + let ret = ''; + types.forEach((t) => { + if (ret) return; + const tv = tagList && tagList[t]; + if (tv && typeof tv === 'string') { + ret = tv.trim(); + } + }); + return ret; + }); + const tagTitle = computed(() => { + let htmlText = ''; + htmlText += filterXSS(props.title); + htmlText = `${htmlText}`; + if (typeName.value) { + const index = htmlText.lastIndexOf('

'); + if (index > -1) { + htmlText = + htmlText.slice(0, index) + + `${typeName.value}` + + htmlText.slice(index); + } else { + htmlText = htmlText + `${typeName.value}`; + } + } + return htmlText; + }); + const handleClick = () => { + if (props.isSelected) { + status.value = 'edit'; + } + }; + const handleChange = (val) => { + emit('change', { + key: 'title', + value: val, + }); + }; + return { + status, + typeName, + tagTitle, + handleClick, + handleChange, + }; + }, + render() { + const { isRequired, tagTitle, indexNumber } = this; + return ( +
+
+ {isRequired && *} +
+ {this.showIndex && {indexNumber}.} + {this.status === 'edit' ? ( +
+ +
+ ) : ( +
+ )} +
+
+
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/VoteModule/index.jsx b/web/src/materials/questions/widgets/VoteModule/index.jsx new file mode 100644 index 00000000..b5447c53 --- /dev/null +++ b/web/src/materials/questions/widgets/VoteModule/index.jsx @@ -0,0 +1,151 @@ +import { computed, defineComponent } from 'vue'; +import baseChoice from '../BaseChoice'; +import Progress from '../../components/Progress.vue'; +import '../../common/css/vote.scss'; +import QuestionWithRule from '@/materials/questions/widgets/QuestionRuleContainer'; +import { includes } from 'lodash'; +export default defineComponent({ + name: 'VoteModule', + components: { baseChoice, Progress, QuestionWithRule }, + props: { + innerType: { + type: String, + default: 'radio', + }, + field: { + type: String, + default: '', + }, + value: { + type: [String, Array], + default: '', + }, + layout: { + type: String, + default: 'vertical', + }, + options: { + type: Array, + default: () => [], + }, + readonly: { + type: Boolean, + default: false, + }, + voteTotal: { + type: Number, + default: 10, + }, + maxNum: { + type: [Number, String], + default: 1, + }, + }, + setup(props, { emit }) { + const disableState = computed(() => { + if (!props.maxNum) { + return false; + } + return props.value.length >= +props.maxNum; + }); + const isDisabled = (item) => { + const { value } = props; + return disableState.value && !includes(value, item.value); + }; + const myOptions = computed(() => { + const { options } = props; + if (props.innerType === 'checkbox') { + return options.map((item) => { + return { + ...item, + disabled: isDisabled(item), + }; + }); + } else { + return options; + } + }); + const calcVotePercent = (option, total) => { + const { voteCount = 0 } = option; + const voteTotal = total || 0; + + if (voteTotal === 0) { + return '0.0'; + } + return ((voteCount * 100) / voteTotal).toFixed(1); + }; + const onChange = (value) => { + const key = props.field; + emit('change', { + key, + value, + }); + }; + const handleSelectMoreChange = (data) => { + const { key, value } = data; + emit('change', { + key, + value, + }); + }; + return { + myOptions, + calcVotePercent, + onChange, + handleSelectMoreChange, + }; + }, + render() { + const { calcVotePercent, innerType, field, myOptions } = this; + const props = { + ...this.$props, + options: myOptions, + layout: 'vertical', + readonly: this.readonly, + name: field, + }; + return ( + { + return ( +
+ +
{`${calcVotePercent( + scoped.option, + scoped.voteTotal + )}%`}
+
{`${ + scoped.option.voteCount || 0 + }票`}
+
+ ); + }, + selectMore: (scoped) => { + return ( + this.handleSelectMoreChange(e)} + > + ); + }, + }} + >
+ ); + }, +}); diff --git a/web/src/materials/questions/widgets/VoteModule/meta.js b/web/src/materials/questions/widgets/VoteModule/meta.js new file mode 100644 index 00000000..699a01f7 --- /dev/null +++ b/web/src/materials/questions/widgets/VoteModule/meta.js @@ -0,0 +1,194 @@ +import basicConfig from '../../common/config/basicConfig'; + +const meta = { + title: '投票', + type: 'vote', + componentName: 'VoteModule', + formConfig: [ + // { + // name: 'fieldId', + // label: '题目ID', + // type: 'Input', + // placeholder: '', + // key: 'field', + // tip: '请谨慎修改题目ID,并保证此ID在整个问卷中唯一', + // relyField: 'questionIdCustomize', + // noNeedRelyClean: true + // }, + // { + // name: 'questionLabel', + // label: '题目标签', + // type: 'Input', + // placeholder: '', + // key: 'label', + // tip: '请谨慎修改题目标签,并保证此标签在整个问卷中唯一', + // relyField: 'questionLabelCustomize', + // noNeedRelyClean: true + // }, + // { + // name: 'titleOrigin', + // label: '标题引用其他题目选项', + // type: 'TitleOrigin', + // options: [], + // key: 'title' + // }, + basicConfig, + { + name: 'optionConfig', + label: '选项配置', + labelStyle: { + 'font-weight': 'bold', + }, + type: 'Customed', + key: 'optionConfig', + content: [ + // { + // label: '选项随机排序', + // type: 'CheckBox', + // key: 'randomSort', + // direction: 'horizon', + // value: false, + // contentPosition: 'before', + // contentClass: 'check-box-config' + // }, + // { + // label: '默认选中第一项', + // type: 'CheckBox', + // key: 'checked', + // direction: 'horizon', + // value: false, + // contentPosition: 'before', + // contentClass: 'check-box-config' + // }, + { + label: '设置为多选题', + type: 'CheckBox', + key: 'innerType', + direction: 'horizon', + value: false, + contentPosition: 'before', + inline: true, + // 输入转换 + valueAdapter({ moduleConfig }) { + if (moduleConfig.innerType === 'checkbox') { + return true; + } else { + return false; + } + }, + // 输出转换 + setterAdapter({ value }) { + return { + key: 'innerType', + value: value ? 'checkbox' : 'radio', + }; + }, + }, + // { + // label: '展示选项余量', + // type: 'CheckBox', + // key: 'showLeftNum', + // direction: 'horizon', + // value: true, + // include: ['appointment'], + // contentPosition: 'before', + // contentClass: 'check-box-config' + // }, + // { + // name: 'inputType', + // label: '切换题型', + // type: 'Radio', + // key: 'selectType', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '单选', + // value: 'radio' + // }, + // { + // label: '多选', + // value: 'checkbox' + // } + // ], + // contentClass: 'radio-config' + // }, + // { + // label: '排列方式', + // type: 'Radio', + // key: 'sortWay', + // direction: 'horizon', + // value: '', + // options: [ + // { + // label: '竖排', + // value: 'v' + // }, + // { + // label: '横排', + // value: 'h' + // } + // ], + // contentClass: 'radio-config' + // }, + { + label: '至少选择数', + type: 'InputNumber', + key: 'minNum', + direction: 'horizon', + value: '', + min: 0, + max: 'maxNum', + contentClass: 'input-number-config', + }, + { + label: '最多选择数', + type: 'InputNumber', + key: 'maxNum', + direction: 'horizon', + value: '', + min: 'minNum', + contentClass: 'input-number-config', + }, + ], + }, + // { + // name: 'optionOrigin', + // label: '选项引用其他题目选项', + // type: 'Select', + // options: [], + // key: 'optionOrigin', + // tip: '支持引用多选题、单选题、矩阵单选题' + // }, + // { + // name: 'originType', + // label: '', + // type: 'Select', + // options: [ + // { + // label: '选中项', + // value: 'selected' + // }, + // { + // label: '未选中项', + // value: 'noSelected' + // } + // ], + // key: 'originType' + // }, + ], + editConfigure: { + optionEdit: { + show: true, + }, + optionEditBar: { + show: true, + configure: { + showOthers: false, + showAdvancedConfig: true, + }, + }, + }, +}; + +export default meta; diff --git a/web/src/materials/setters/constant.js b/web/src/materials/setters/constant.js new file mode 100644 index 00000000..e26ee302 --- /dev/null +++ b/web/src/materials/setters/constant.js @@ -0,0 +1 @@ +export const FORM_CHANGE_EVENT_KEY = 'form-change'; diff --git a/web/src/materials/setters/setterLoader.js b/web/src/materials/setters/setterLoader.js new file mode 100644 index 00000000..2f74e854 --- /dev/null +++ b/web/src/materials/setters/setterLoader.js @@ -0,0 +1,10 @@ +import ComponentLoader from '@/materials/utils/componentLoader'; +export class SetterLoader extends ComponentLoader { + dynamicImport(path) { + return import(`@/materials/setters/widgets/${path}.vue`); + } +} + +const setterLoader = new SetterLoader(); + +export default setterLoader; diff --git a/web/src/materials/setters/widgets/CheckBox.vue b/web/src/materials/setters/widgets/CheckBox.vue new file mode 100644 index 00000000..5812628a --- /dev/null +++ b/web/src/materials/setters/widgets/CheckBox.vue @@ -0,0 +1,99 @@ + + + diff --git a/web/src/materials/setters/widgets/CheckboxGroup.vue b/web/src/materials/setters/widgets/CheckboxGroup.vue new file mode 100644 index 00000000..3c680e4a --- /dev/null +++ b/web/src/materials/setters/widgets/CheckboxGroup.vue @@ -0,0 +1,74 @@ + + + diff --git a/web/src/materials/setters/widgets/ColorInput.vue b/web/src/materials/setters/widgets/ColorInput.vue new file mode 100644 index 00000000..247d7bdc --- /dev/null +++ b/web/src/materials/setters/widgets/ColorInput.vue @@ -0,0 +1,33 @@ + + diff --git a/web/src/materials/setters/widgets/CustomedSwitch.vue b/web/src/materials/setters/widgets/CustomedSwitch.vue new file mode 100644 index 00000000..eb8b9f69 --- /dev/null +++ b/web/src/materials/setters/widgets/CustomedSwitch.vue @@ -0,0 +1,24 @@ + + diff --git a/web/src/materials/setters/widgets/FormItem.vue b/web/src/materials/setters/widgets/FormItem.vue new file mode 100644 index 00000000..edb859c4 --- /dev/null +++ b/web/src/materials/setters/widgets/FormItem.vue @@ -0,0 +1,49 @@ + + + diff --git a/web/src/materials/setters/widgets/FormdataBackFill.vue b/web/src/materials/setters/widgets/FormdataBackFill.vue new file mode 100644 index 00000000..a3236219 --- /dev/null +++ b/web/src/materials/setters/widgets/FormdataBackFill.vue @@ -0,0 +1,98 @@ + + + diff --git a/web/src/materials/setters/widgets/FreqAndNumberLimit.vue b/web/src/materials/setters/widgets/FreqAndNumberLimit.vue new file mode 100644 index 00000000..19394ec4 --- /dev/null +++ b/web/src/materials/setters/widgets/FreqAndNumberLimit.vue @@ -0,0 +1,66 @@ + + + diff --git a/web/src/materials/setters/widgets/Input.vue b/web/src/materials/setters/widgets/Input.vue new file mode 100644 index 00000000..d37fc22e --- /dev/null +++ b/web/src/materials/setters/widgets/Input.vue @@ -0,0 +1,58 @@ + + + diff --git a/web/src/materials/setters/widgets/InputNumber.vue b/web/src/materials/setters/widgets/InputNumber.vue new file mode 100644 index 00000000..b8e6c882 --- /dev/null +++ b/web/src/materials/setters/widgets/InputNumber.vue @@ -0,0 +1,116 @@ + + + diff --git a/web/src/materials/setters/widgets/InputPercent.vue b/web/src/materials/setters/widgets/InputPercent.vue new file mode 100644 index 00000000..44b91a34 --- /dev/null +++ b/web/src/materials/setters/widgets/InputPercent.vue @@ -0,0 +1,73 @@ + + + diff --git a/web/src/materials/setters/widgets/MultiInput.vue b/web/src/materials/setters/widgets/MultiInput.vue new file mode 100644 index 00000000..35082695 --- /dev/null +++ b/web/src/materials/setters/widgets/MultiInput.vue @@ -0,0 +1,75 @@ + + + diff --git a/web/src/materials/setters/widgets/MultiSelect.vue b/web/src/materials/setters/widgets/MultiSelect.vue new file mode 100644 index 00000000..0acbe22a --- /dev/null +++ b/web/src/materials/setters/widgets/MultiSelect.vue @@ -0,0 +1,88 @@ + + + + diff --git a/web/src/materials/setters/widgets/QuestionTime.vue b/web/src/materials/setters/widgets/QuestionTime.vue new file mode 100644 index 00000000..88fd7f21 --- /dev/null +++ b/web/src/materials/setters/widgets/QuestionTime.vue @@ -0,0 +1,80 @@ + + + diff --git a/web/src/materials/setters/widgets/QuestionTimeHour.vue b/web/src/materials/setters/widgets/QuestionTimeHour.vue new file mode 100644 index 00000000..c879ae0e --- /dev/null +++ b/web/src/materials/setters/widgets/QuestionTimeHour.vue @@ -0,0 +1,108 @@ + + + diff --git a/web/src/materials/setters/widgets/Radio.vue b/web/src/materials/setters/widgets/Radio.vue new file mode 100644 index 00000000..40426b0e --- /dev/null +++ b/web/src/materials/setters/widgets/Radio.vue @@ -0,0 +1,125 @@ + + + diff --git a/web/src/materials/setters/widgets/RadioGroup.vue b/web/src/materials/setters/widgets/RadioGroup.vue new file mode 100644 index 00000000..e8ec1345 --- /dev/null +++ b/web/src/materials/setters/widgets/RadioGroup.vue @@ -0,0 +1,83 @@ + + + diff --git a/web/src/materials/setters/widgets/Range.vue b/web/src/materials/setters/widgets/Range.vue new file mode 100644 index 00000000..98c20fd1 --- /dev/null +++ b/web/src/materials/setters/widgets/Range.vue @@ -0,0 +1,83 @@ + + + diff --git a/web/src/materials/setters/widgets/RichText.vue b/web/src/materials/setters/widgets/RichText.vue new file mode 100644 index 00000000..303c5929 --- /dev/null +++ b/web/src/materials/setters/widgets/RichText.vue @@ -0,0 +1,137 @@ + + + + diff --git a/web/src/materials/setters/widgets/Select.vue b/web/src/materials/setters/widgets/Select.vue new file mode 100644 index 00000000..eda029a4 --- /dev/null +++ b/web/src/materials/setters/widgets/Select.vue @@ -0,0 +1,101 @@ + + + diff --git a/web/src/materials/utils/componentLoader.js b/web/src/materials/utils/componentLoader.js new file mode 100644 index 00000000..7e2e56b5 --- /dev/null +++ b/web/src/materials/utils/componentLoader.js @@ -0,0 +1,59 @@ +import _cloneDeep from 'lodash/cloneDeep'; +export default class ComponentLoader { + constructor(options = {}) { + const { componentList, lifeCycle } = options; + this.components = {}; // 已加载组件 + this.componentInfoList = componentList || []; + if (lifeCycle) { + this.lifeCycle = lifeCycle; + } + } + + async loadComponent(type, path) { + if (this.components[type]) { + return { type, component: this.components[type] }; + } else { + let count = 0; + const load = async () => { + try { + count++; + const res = await this.dynamicImport(path); + const index = _cloneDeep( + res.default.components && res.default.components.Index + ); + const component = index ? index : res.default; + if (!component.name) { + // console.error(`组件:${type} 未定义 name`) + component.name = path || type; + } + component.path = path; + this.components[type] = component; + if (this.lifeCycle?.onComponentLoaded) { + this.lifeCycle?.onComponentLoaded.call(this, { + component, + type, + meta: res.meta, + }); + } + return { type, component }; + } catch (error) { + if (count < 3) { + return await load(); + } + } + }; + + const result = await load(); + return result; + } + } + + loadComponents(componentList) { + if (componentList === undefined) { + componentList = this.componentInfoList; + } + return Promise.all( + componentList.map((item) => this.loadComponent(item.type, item.path)) + ); + } +} diff --git a/web/src/render/App.vue b/web/src/render/App.vue new file mode 100644 index 00000000..9a78c7a7 --- /dev/null +++ b/web/src/render/App.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/web/src/render/adapter/formValue.js b/web/src/render/adapter/formValue.js new file mode 100644 index 00000000..62c73e5c --- /dev/null +++ b/web/src/render/adapter/formValue.js @@ -0,0 +1,56 @@ +// 定义提交的数据结构:{ field1: '', field2: [], field1_hash1: '', } +export default function ({ dataConf }) { + const dataList = dataConf.dataList; + const formValues = {}; + for (const item of dataList) { + // 题目id + const key = item.field; + const { extraOptions, options, type, rangeConfig, innerType } = item; + let value = ''; + + // if (Array.isArray(extraOptions) || Array.isArray(options)) { + // // 有固定选项或者有选项,开启了默认选中第一个 + // if (checked) { + // const firstOption = extraOptions?.[0] || options?.[0] + // value = firstOption?.hash || '' + // } + // } + + // 题型是多选,或者子题型是多选(innerType是用于投票) + if (/checkbox/.test(type) || innerType === 'checkbox') { + value = value ? [value] : []; + } + formValues[key] = value; + + const allOptions = []; + // 有固定选项 + if (Array.isArray(extraOptions)) { + allOptions.push(...extraOptions); + } + // 有选项 + if (Array.isArray(options)) { + allOptions.push(...options); + } + // 对所有选项遍历 + for (const optionItem of allOptions) { + if (optionItem.others) { + // 开启了更多输入框,生成更多输入框的key + const opKey = `${key}_${optionItem.hash}`; + formValues[opKey] = ''; + } + } + + // 星级评分开启了更多输入框 + if (rangeConfig && Object.keys(rangeConfig).length > 0) { + for (const rkey of Object.keys(rangeConfig)) { + if (rangeConfig[rkey].isShowInput) { + const rangeKey = `${key}_${rkey}`; + formValues[rangeKey] = ''; + } + } + } + } + return { + formValues, + }; +} diff --git a/web/src/render/adapter/index.js b/web/src/render/adapter/index.js new file mode 100644 index 00000000..f3179762 --- /dev/null +++ b/web/src/render/adapter/index.js @@ -0,0 +1,34 @@ +import question from './question'; +import rules from './rules'; +import questionSeq from './questionSeq'; +import formValue from './formValue'; + +const adapter = (() => { + const list = []; + + const exec = (questionData) => { + return list.reduce( + (pre, next) => ({ ...pre, ...next(questionData, pre) }), + {} + ); + }; + + return { + add(fun) { + list.push(fun); + }, + exec, + // 部分问卷需要依赖一些异步的数据 + generateData(questionData) { + return exec(questionData); + }, + }; +})(); + +adapter.add(question); +adapter.add(rules); +adapter.add(questionSeq); +adapter.add(formValue); + +// 对 +export default adapter; diff --git a/web/src/render/adapter/question.js b/web/src/render/adapter/question.js new file mode 100644 index 00000000..4a9fc3b4 --- /dev/null +++ b/web/src/render/adapter/question.js @@ -0,0 +1,45 @@ +/** + * 处理单题的配置 + */ + +import _get from 'lodash/get'; +import _map from 'lodash/map'; + +// 处理选择题的options +function handleOptions(item) { + const { type } = item; + const options = item.options || []; + + const arr = _map(options, (optionItem) => { + const cleanOption = {}; + + // 投票逻辑处理 + if (type.indexOf('vote') > -1) { + cleanOption.voteCount = 0; + } + + return { value: optionItem['hash'], ...optionItem, ...cleanOption }; + }); + + return { options: arr }; +} + +export default function (questionConfig) { + let dataList = _get(questionConfig, 'dataConf.dataList'); + // 将题目列表转成对象,并且对题目类型、题目的选项做一些字段的增加和转换 + const questionData = dataList.reduce((pre, item) => { + Object.assign(pre, { + [item.field]: { + indexNumber: '', + voteTotal: 0, + ...item, + ...handleOptions(item), + }, + }); + return pre; + }, {}); + + return { + questionData, + }; +} diff --git a/web/src/render/adapter/questionSeq.js b/web/src/render/adapter/questionSeq.js new file mode 100644 index 00000000..c11cbc3f --- /dev/null +++ b/web/src/render/adapter/questionSeq.js @@ -0,0 +1,20 @@ +import _get from 'lodash/get'; +import _last from 'lodash/last'; + +export default function handleQuestionSeq(questionConfig) { + const dataList = _get(questionConfig, 'dataConf.dataList', []); + return { + // 对题目做一些排序和分组,返回题目id的列表 + questionSeq: dataList.reduce( + (pre, item) => { + const { field } = item; + + // 每次都在最后一个数组里push题目 + _last(pre).push(field); + + return pre; + }, + [[]] + ), + }; +} diff --git a/web/src/render/adapter/rules.js b/web/src/render/adapter/rules.js new file mode 100644 index 00000000..2d8856e7 --- /dev/null +++ b/web/src/render/adapter/rules.js @@ -0,0 +1,280 @@ +import _forEach from 'lodash/forEach'; +import _get from 'lodash/get'; +import _isArray from 'lodash/isArray'; +import _keys from 'lodash/keys'; +import _set from 'lodash/set'; + +const regexpMap = { + nd: /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/, + m: /^[1]([3-9])[0-9]{9}$/, + idcard: /^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/, + strictIdcard: + /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/, + n: /^[0-9]+([.]{1}[0-9]+){0,1}$/, + e: /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/, + licensePlate: + /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[a-zA-Z](([DFAG]((?![IO])[a-zA-Z0-9](?![IO]))[0-9]{4})|([0-9]{5}[DF]))|[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4,5}[A-Z0-9挂学警港澳]{1})$/, +}; + +const msgMap = { + '*': '必填', + m: '请输入手机号', + idcard: '请输入正确的身份证号码', + strictIdcard: '请输入正确的身份证号码', + n: '请输入数字', + nd: '请输入数字', + e: '请输入邮箱', + licensePlate: '请输入车牌号', +}; +const inputType = ['text', 'textarea']; +const checkBoxTip = '至少选择#min#项,少选择了#less#项'; +const checkBoxTipSame = '请选择#min#项,少选择了#less#项'; +const textRangeMinTip = '至少输入#min#字'; +const numberRangeMinTip = '数字最小为#min#'; +const numberRangeMaxTip = '数字最大为#max#'; + +// 多选题的选项数目限制 +export function optionValidator(value, minNum, maxNum) { + let tip = minNum === maxNum ? checkBoxTipSame : checkBoxTip; + if (_isArray(value) && value.length < minNum) { + const less = minNum - value.length; + tip = tip.replace(/#min#/g, minNum); + tip = tip.replace(/#less#/g, less); + return tip; + } + return ''; +} + +// textarea最小字数检验 +export function textAreaValidator(isRequired, value, textRangeMin) { + let tip = textRangeMinTip; + if (value && value.length < parseInt(textRangeMin)) { + tip = tip.replace(/#min#/g, textRangeMin); + return tip; + } + return ''; +} + +// 数字类的输入框,配置了最小值的,要对数值做校验 +export function numberMinValidator(value, numberRangeMin) { + let tip = numberRangeMinTip; + if (Number(value) < Number(numberRangeMin)) { + tip = tip.replace(/#min#/g, numberRangeMin); + return tip; + } + return ''; +} +// 数字类的输入框,配置了最大值的,要对数值做校验 +export function numberMaxValidator(value, numberRangeMax) { + let tip = numberRangeMaxTip; + if (Number(value) > Number(numberRangeMax)) { + tip = tip.replace(/#max#/g, numberRangeMax); + return tip; + } + return ''; +} + +// 根据提醒和题目的配置,生成本题的校验规则 +export function generateValidArr( + isRequired, + valid, + minNum, + textRangeMin, + type, + numberRangeMin, + numberRangeMax +) { + const validArr = []; + const isInput = inputType.indexOf(type) !== -1; + if (isRequired || valid === '*') { + // 输入框的必填校验做trim + if (!isInput) { + validArr.push({ + required: true, + message: '此项未填,请填写完整', + trigger: 'change|blur', + }); + } else { + validArr.push({ + required: true, + validator(rule, value, callback) { + let errors = []; + let tip = ''; + if (value === '' || value?.replace(/\s*/, '') === '') { + tip = '此项未填,请填写完整'; + } + if (tip) { + errors = [tip]; + } + callback(errors); + }, + trigger: 'change|blur', + }); + } + } + if (regexpMap[valid]) { + validArr.push({ + validator(rule, value, callback) { + let errors = []; + let tip = ''; + if (!regexpMap[valid].test(value)) { + tip = msgMap[valid]; + } + if (value === '') { + tip = ''; + } + if (tip) { + errors = [tip]; + } + callback(errors); + }, + trigger: 'change|blur', + }); + } + + if (minNum) { + validArr.unshift({ + validator(rule, value, callback) { + let errors = []; + const tip = optionValidator(value, minNum); + if (tip) { + errors = [tip]; + } + callback(errors); + }, + trigger: 'change|blur', + }); + } + + if (textRangeMin) { + validArr.push({ + validator(rule, value, callback) { + let errors = []; + const tip = textAreaValidator(isRequired, value, textRangeMin); + if (tip) { + errors = [tip]; + } + callback(errors); + }, + trigger: 'change|blur', + }); + } + + if (isInput && valid === 'n' && numberRangeMin) { + validArr.push({ + validator(rule, value, callback) { + let errors = []; + const tip = numberMinValidator(value, numberRangeMin); + if (tip) { + errors = [tip]; + } + callback(errors); + }, + trigger: 'change|blur', + }); + } + + if (isInput && valid === 'n' && numberRangeMax) { + validArr.push({ + validator(rule, value, callback) { + let errors = []; + const tip = numberMaxValidator(value, numberRangeMax); + if (tip) { + errors = [tip]; + } + callback(errors); + }, + trigger: 'change|blur', + }); + } + + return validArr; +} + +// 生成选择类或者评分类的题目的更多输入框 +const generateOthersKeyMap = (question) => { + const { type, field, options, rangeConfig } = question; + let othersKeyMap = undefined; + + if (['radio-star'].includes(type)) { + othersKeyMap = {}; + for (const key in rangeConfig) { + if (rangeConfig[key].isShowInput) { + othersKeyMap[`${field}_${key}`] = key; + } + } + } else if (type.includes('radio') || type.includes('checkbox')) { + othersKeyMap = {}; + options + .filter((op) => op.others) + .forEach((option) => { + othersKeyMap[`${field}_${option.hash}`] = option.text; + }); + } + return othersKeyMap; +}; + +// 生成所有题目的校验规则 +export default function (questionConfig) { + const dataList = _get(questionConfig, 'dataConf.dataList'); + const rules = dataList.reduce((pre, current) => { + const { + field, + valid, + minNum, + // othersKeyMap, + type, + options, + isRequired, + textRange, + numberRange, + rangeConfig, + } = current; + const othersKeyMap = generateOthersKeyMap(current); + // 部分题目不校验 + if (valid === '0' || /mobileHidden|section|hidden/.test(type)) { + return pre; + } + + let validMap = {}; + const textRangeMin = _get(textRange, 'min.value'); + const numberRangeMin = _get(numberRange, 'min.value'); + const numberRangeMax = _get(numberRange, 'max.value'); + + const validArr = generateValidArr( + isRequired, + valid, + minNum, + textRangeMin, + type, + numberRangeMin, + numberRangeMax + ); + + validMap = { [field]: validArr }; + + // 对于选择题支持填写更多信息的,需要做是否必填的校验 + if (_keys(othersKeyMap).length) { + if (['radio-star'].includes(type)) { + if (rangeConfig) { + for (const key in rangeConfig) { + if (rangeConfig[key].isShowInput && rangeConfig[key].required) { + _set(validMap, `${field}_${key}`, generateValidArr(true, '')); + } + } + } + } else { + _forEach(options, (item) => { + const othersKey = `${field}_${item.hash}` + const { mustOthers } = item; + if (mustOthers) { + _set(validMap, othersKey, generateValidArr(true, '')); + } + }); + } + } + + return Object.assign(validMap, pre); + }, {}); + return { rules }; +} diff --git a/web/src/render/api/base.js b/web/src/render/api/base.js new file mode 100644 index 00000000..67c722b7 --- /dev/null +++ b/web/src/render/api/base.js @@ -0,0 +1,60 @@ +import axios from 'axios'; +import sha256 from 'crypto-js/sha256'; + +// 生成axios实例 +const instance = axios.create({ + baseURL: '/api', + timeout: 3000, +}); + +// 对数据进行过滤,将undefined转成空字符串 +const undefinedToString = (data) => { + const res = {}; + for (const key in data) { + if (data[key] === undefined) { + res[key] = ''; + } else { + res[key] = data[key]; + } + } + return res; +}; + +// 根据数据生成签名 +const getSignByData = (sourceData) => { + const data = undefinedToString(sourceData); + const keysArr = Object.keys(data); + keysArr.sort(); + let signArr = keysArr.map((key) => { + if (typeof data[key] === 'string') { + return `${key}=${encodeURIComponent(data[key])}`; + } + return `${key}=${JSON.stringify(data[key])}`; + }); + const ts = Date.now(); + const sign = sha256(signArr.join('') + ts); + return `${sign}.${ts}`; +}; + +// 请求中间件,对所有请求都生成签名 +instance.interceptors.request.use((request) => { + let data; + if (request.method === 'get') { + data = request.params; + } else if (request.method === 'post') { + data = request.data; + } + const sign = getSignByData(data); + data.sign = sign; + return request; +}); + +// 对响应的数据,取data +instance.interceptors.response.use((response) => { + if (response.status !== 200) { + throw new Error('http请求出错'); + } + return response.data; +}); + +export default instance; diff --git a/web/src/render/api/survey.js b/web/src/render/api/survey.js new file mode 100644 index 00000000..a57dba81 --- /dev/null +++ b/web/src/render/api/survey.js @@ -0,0 +1,22 @@ +import axios from './base'; + +export const getPublishedSurveyInfo = ({ surveyPath }) => { + return axios.get('/surveyPublish/getSurveyPublish', { + params: { + surveyPath, + }, + }); +}; + +export const submitForm = (data) => { + return axios.post('/surveyPublish/submit', data); +}; + +export const queryVote = ({ surveyPath, voteKeyList }) => { + return axios.get('/surveyPublish/queryVote', { + params: { + surveyPath, + voteKeyList, + }, + }); +}; diff --git a/web/src/render/components/alert.vue b/web/src/render/components/alert.vue new file mode 100644 index 00000000..ede3fa71 --- /dev/null +++ b/web/src/render/components/alert.vue @@ -0,0 +1,45 @@ + + + diff --git a/web/src/render/components/confirm.vue b/web/src/render/components/confirm.vue new file mode 100644 index 00000000..04797f2d --- /dev/null +++ b/web/src/render/components/confirm.vue @@ -0,0 +1,69 @@ + + + diff --git a/web/src/render/components/form.vue b/web/src/render/components/form.vue new file mode 100644 index 00000000..1375e738 --- /dev/null +++ b/web/src/render/components/form.vue @@ -0,0 +1,82 @@ + + + diff --git a/web/src/render/components/header.vue b/web/src/render/components/header.vue new file mode 100755 index 00000000..6188ac23 --- /dev/null +++ b/web/src/render/components/header.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/web/src/render/components/logo.vue b/web/src/render/components/logo.vue new file mode 100644 index 00000000..aa194b8b --- /dev/null +++ b/web/src/render/components/logo.vue @@ -0,0 +1,32 @@ + + + diff --git a/web/src/render/components/mainRenderer.vue b/web/src/render/components/mainRenderer.vue new file mode 100644 index 00000000..2a1e0e44 --- /dev/null +++ b/web/src/render/components/mainRenderer.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/web/src/render/components/materialGroup.vue b/web/src/render/components/materialGroup.vue new file mode 100644 index 00000000..98955c34 --- /dev/null +++ b/web/src/render/components/materialGroup.vue @@ -0,0 +1,65 @@ + diff --git a/web/src/render/components/progressBar.vue b/web/src/render/components/progressBar.vue new file mode 100644 index 00000000..a7469ea9 --- /dev/null +++ b/web/src/render/components/progressBar.vue @@ -0,0 +1,57 @@ + + + diff --git a/web/src/render/components/submit.vue b/web/src/render/components/submit.vue new file mode 100644 index 00000000..a7bb1e08 --- /dev/null +++ b/web/src/render/components/submit.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/web/src/render/main.js b/web/src/render/main.js new file mode 100644 index 00000000..d378be33 --- /dev/null +++ b/web/src/render/main.js @@ -0,0 +1,22 @@ +import Vue from 'vue'; +import App from './App.vue'; +import store from './store'; +import { filterXSS } from '@/common/xss'; +import DialogPlugin from '@/render/plugins/dialog/index'; +import './styles/reset.scss'; + +Vue.config.productionTip = false; + +Vue.use(DialogPlugin); + +Vue.directive('safe-html', { + inserted: function (el, binding) { + const res = filterXSS(binding.value); + el.innerHTML = res; + }, +}); + +new Vue({ + render: (h) => h(App), + store, +}).$mount('#app'); diff --git a/web/src/render/pages/emptyPage.vue b/web/src/render/pages/emptyPage.vue new file mode 100644 index 00000000..a0187e26 --- /dev/null +++ b/web/src/render/pages/emptyPage.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/web/src/render/pages/errorPage.vue b/web/src/render/pages/errorPage.vue new file mode 100755 index 00000000..1d7e5aa2 --- /dev/null +++ b/web/src/render/pages/errorPage.vue @@ -0,0 +1,53 @@ + + + diff --git a/web/src/render/pages/index.vue b/web/src/render/pages/index.vue new file mode 100644 index 00000000..898709e7 --- /dev/null +++ b/web/src/render/pages/index.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/web/src/render/pages/successPage.vue b/web/src/render/pages/successPage.vue new file mode 100644 index 00000000..9fed5e4c --- /dev/null +++ b/web/src/render/pages/successPage.vue @@ -0,0 +1,55 @@ + + + diff --git a/web/src/render/plugins/dialog/index.js b/web/src/render/plugins/dialog/index.js new file mode 100644 index 00000000..878a658d --- /dev/null +++ b/web/src/render/plugins/dialog/index.js @@ -0,0 +1,56 @@ +import confirm from '../../components/confirm.vue'; +import alert from '../../components/alert.vue'; + +import _isFunction from 'lodash/isFunction'; + +export default { + install(Vue) { + Vue.prototype.$dialog = { + confirm(options) { + const MyComponent = Vue.extend(confirm); + const instance = new MyComponent({ + propsData: options, + }); + const closeConfirm = () => { + if (instance && instance.$el) { + instance.$el.remove(); + } + }; + instance.$on('cancel', () => { + if (options?.onCancel && _isFunction(options.onCancel)) { + options.onCancel(closeConfirm); + } else { + closeConfirm(); + } + }); + instance.$on('confirm', () => { + if (options?.onConfirm && _isFunction(options.onConfirm)) { + options.onConfirm(closeConfirm); + } + }); + instance.$mount(); + document.body.append(instance.$el); + }, + alert(options) { + const MyComponent = Vue.extend(alert); + const instance = new MyComponent({ + propsData: options, + }); + const closeConfirm = () => { + if (instance && instance.$el) { + instance.$el.remove(); + } + }; + instance.$on('confirm', () => { + if (options?.onConfirm && _isFunction(options.onConfirm)) { + options.onConfirm(closeConfirm); + } else { + closeConfirm(); + } + }); + instance.$mount(); + document.body.append(instance.$el); + }, + }; + }, +}; diff --git a/web/src/render/store/actions.js b/web/src/render/store/actions.js new file mode 100644 index 00000000..490b2d7d --- /dev/null +++ b/web/src/render/store/actions.js @@ -0,0 +1,104 @@ +import moment from 'moment'; +import adapter from '../adapter'; +import { queryVote } from '@/render/api/survey'; + +export default { + // 初始化 + init( + { commit, dispatch }, + { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf } + ) { + commit('setEnterTime'); + const { begTime, endTime, answerBegTime, answerEndTime } = baseConf; + const { msgContent } = submitConf; + const now = Date.now(); + if (now < new Date(begTime).getTime()) { + commit('setRouter', 'errorPage'); + commit('setErrorInfo', { + errorType: 'overTime', + errorMsg: `

问卷未到开始填写时间,暂时无法进行填写

+

开始时间为: ${begTime}

`, + }); + return; + } else if (now > new Date(endTime).getTime()) { + commit('setRouter', 'errorPage'); + commit('setErrorInfo', { + errorType: 'overTime', + errorMsg: msgContent.msg_9001 || '您来晚了,感谢支持问卷~', + }); + return; + } else if (answerBegTime && answerEndTime) { + const momentNow = moment(); + const todayStr = momentNow.format('yyyy-MM-DD'); + const momentStartTime = moment(`${todayStr} ${answerBegTime}`); + const momentEndTime = moment(`${todayStr} ${answerEndTime}`); + if (momentNow.isBefore(momentStartTime) || momentNow.isAfter(momentEndTime)) { + commit('setRouter', 'errorPage'); + commit('setErrorInfo', { + errorType: 'overTime', + errorMsg: `

不在答题时间范围内,暂时无法进行填写

+

答题时间为: ${answerBegTime} ~ ${answerEndTime}

`, + }); + return; + } + } + commit('setRouter', 'indexPage'); + + // 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段 + const { questionData, questionSeq, rules, formValues } = + adapter.generateData({ + bannerConf, + baseConf, + bottomConf, + dataConf, + skinConf, + submitConf, + }); + + // 将数据设置到state上 + commit('assignState', { + questionData, + questionSeq, + rules, + bannerConf, + baseConf, + bottomConf, + dataConf, + skinConf, + submitConf, + formValues, + }); + // 获取已投票数据 + dispatch('initVoteData'); + }, + // 用户输入或者选择后,更新表单数据 + changeData({ commit }, data) { + commit('changeFormData', data); + }, + // 初始化投票题的数据 + async initVoteData({ state, commit }) { + const questionData = state.questionData; + const surveyPath = state.surveyPath; + + const voteKeyList = []; + + for (const field in questionData) { + const { type } = questionData[field]; + if (/vote/.test(type)) { + voteKeyList.push(field); + } + } + + if (voteKeyList.length <= 0) { + return; + } + const voteRes = await queryVote({ + surveyPath, + voteKeyList: voteKeyList.join(','), + }); + + if (voteRes.code === 200) { + commit('setVoteMap', voteRes.data); + } + }, +}; diff --git a/web/src/render/store/getters.js b/web/src/render/store/getters.js new file mode 100644 index 00000000..8bc84e55 --- /dev/null +++ b/web/src/render/store/getters.js @@ -0,0 +1,121 @@ +import { flatten } from 'lodash'; + +export default { + // 题目列表 + renderData: (state) => { + const { questionSeq, questionData, formValues } = state; + let index = 1; + return ( + questionSeq && + questionSeq.reduce((pre, item) => { + const questionArr = []; + for (const questionKey of item) { + const question = { ...questionData[questionKey] }; + const { type, extraOptions, options, rangeConfig } = question; + + const questionVal = formValues[questionKey]; + + question.value = questionVal; + // 本题开启了 + if (question.showIndex) { + question.indexNumber = index++; + } + + const allOptions = []; + if (Array.isArray(extraOptions)) { + allOptions.push(...extraOptions); + } + if (Array.isArray(options)) { + allOptions.push(...options); + } + + let othersValue = {}; + let voteTotal = 0; + const voteMap = state.voteMap; + if (/vote/.test(type)) { + voteTotal = voteMap?.[questionKey]?.total || 0; + } + // 遍历所有的选项 + for (const optionItem of allOptions) { + // 开启了更多输入框,生成othersValue的值 + if (optionItem.others) { + const opKey = `${questionKey}_${optionItem.hash}`; + optionItem.othersKey = opKey; + optionItem.othersValue = formValues[opKey]; + othersValue[opKey] = formValues[opKey]; + } + + // 投票题,用户手动选择选项后,要实时更新展示数据和进度 + if (/vote/.test(type)) { + const voteCount = voteMap?.[questionKey]?.[optionItem.hash] || 0; + if ( + Array.isArray(questionVal) + ? questionVal.includes(optionItem.hash) + : questionVal === optionItem.hash + ) { + optionItem.voteCount = voteCount + 1; + voteTotal = voteTotal + 1; + } else { + optionItem.voteCount = voteCount; + } + question.voteTotal = voteTotal; + } + } + + // 开启了更多输入框,要将当前的value赋值给question + if ( + rangeConfig && + Object.keys(rangeConfig).length > 0 && + rangeConfig[questionVal] + ) { + const curRange = rangeConfig[questionVal]; + if (curRange?.isShowInput) { + const rangeKey = `${questionKey}_${questionVal}`; + curRange.othersKey = rangeKey; + curRange.othersValue = formValues[rangeKey]; + othersValue[rangeKey] = formValues[rangeKey]; + } + } + + // 将othersValue赋值给 + question.othersValue = othersValue; + questionArr.push(question); + } + + if (questionArr && questionArr.length) { + pre.push(questionArr); + } + return pre; + }, []) + ); + }, + // 根据渲染的题目生成的用户输入或者选择的数据 + formModel: (state, getters) => { + const { renderData } = getters; + const formdata = flatten(renderData).reduce((pre, current) => { + const { othersValue, type, field } = current; + if (othersValue && Object.keys(othersValue).length) { + Object.assign(pre, othersValue); + } + switch (type) { + // case 'fillin': + // current.fillinConfig.forEach(item => { + // item.forEach(subItem => { + // if (subItem.blanks > 0) { + // const resultField = `${field}_${subItem.hash}` + // Object.assign(pre, { [resultField]: subItem.value }) + // } + // }) + // }) + // Object.assign(pre, { [field]: formValues[field] }) + // break + default: + Object.assign(pre, { [field]: current.value }); + break; + } + + return pre; + }, {}); + return formdata; + }, +}; diff --git a/web/src/render/store/index.js b/web/src/render/store/index.js new file mode 100644 index 00000000..eaeceff0 --- /dev/null +++ b/web/src/render/store/index.js @@ -0,0 +1,15 @@ +import Vue from 'vue'; +import Vuex, { Store } from 'vuex'; +Vue.use(Vuex); + +import state from './state'; +import getters from './getters'; +import mutations from './mutations'; +import actions from './actions'; + +export default new Store({ + state, + getters, + mutations, + actions, +}); diff --git a/web/src/render/store/mutations.js b/web/src/render/store/mutations.js new file mode 100644 index 00000000..02b7a09f --- /dev/null +++ b/web/src/render/store/mutations.js @@ -0,0 +1,43 @@ +import Vue from 'vue'; +import { forEach, set } from 'lodash'; +export default { + // 将数据设置到state上 + assignState(state, data) { + forEach(data, (value, key) => { + Vue.set(state, key, value); + }); + }, + setQuestionData(state, data) { + state.questionData = data; + }, + setRouter(state, data) { + state.router = data; + }, + setErrorInfo(state, { errorType, errorMsg }) { + state.errorInfo = { + errorType, + errorMsg, + }; + }, + changeFormData(state, data) { + let { key, value } = data; + set(state, `formValues.${key}`, value); + // set(state, `questionData.${key}.value`, value) + }, + changeSelectMoreData(state, data) { + const { key, value, field } = data; + set(state, `questionData.${field}.othersValue.${key}`, value); + }, + setEnterTime(state) { + state.enterTime = Date.now(); + }, + setSurveyPath(state, data) { + state.surveyPath = data; + }, + setVoteMap(state, data) { + Vue.set(state, 'voteMap', data); + }, + setQuestionSeq(state, data) { + state.questionSeq = data; + }, +}; diff --git a/web/src/render/store/state.js b/web/src/render/store/state.js new file mode 100644 index 00000000..ac834459 --- /dev/null +++ b/web/src/render/store/state.js @@ -0,0 +1,15 @@ +import { isMobile } from '../utils/index'; + +export default { + surveyPath: '', + questionData: null, + router: '', + isMobile: isMobile(), + errorInfo: { + errorType: '', + errorMsg: '', + }, + enterTime: null, + questionSeq: [], // 题目的顺序,因为可能会有分页的情况,所以是一个二维数组[[qid1, qid2], [qid3,qid4]] + voteMap: {}, +}; diff --git a/web/src/render/styles/default.scss b/web/src/render/styles/default.scss new file mode 100644 index 00000000..4b67849b --- /dev/null +++ b/web/src/render/styles/default.scss @@ -0,0 +1,23 @@ +$primary-color: #FAA600; +$primary-color-light: hsl(48, 100%, 97%); + +$title-color-deep: #292a36; +$title-color: #4a4c5b; +$font-color: #6e707c; +$remark-color: #4a4c5b; +$placeholder-color: #c8c9cd; +$light-focus-color: #666666; + +$disable-color: #f2f4f7; +$border-color: #dee2e6; + +$spliter-color: #f7f7f7; + +$error-color: #ec4e29; + + +@import './variable'; + +$title-size: 0.32rem; +$font-size: 0.28rem; +$tip-size: 0.22rem; diff --git a/web/src/render/styles/dialog.scss b/web/src/render/styles/dialog.scss new file mode 100644 index 00000000..85eb6b08 --- /dev/null +++ b/web/src/render/styles/dialog.scss @@ -0,0 +1,26 @@ +.mask { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: rgba(0, 0, 0, 0.3); +} + +.box { + width: 6rem; + background: #fff; + padding: 0.56rem 0.44rem 0.32rem; +} + +.title { + font-size: .3rem; + color: #4a4c5b; + letter-spacing: 0; + text-align: center; + font-weight: 600; +} \ No newline at end of file diff --git a/web/src/render/styles/icon.scss b/web/src/render/styles/icon.scss new file mode 100644 index 00000000..6c75ec54 --- /dev/null +++ b/web/src/render/styles/icon.scss @@ -0,0 +1,18 @@ +@font-face { + font-family: "iconfont"; /* Project id 4263882 */ + src: url('//at.alicdn.com/t/c/font_4263882_y9jng0gwthr.woff2?t=1695631530492') format('woff2'), + url('//at.alicdn.com/t/c/font_4263882_y9jng0gwthr.woff?t=1695631530492') format('woff'), + url('//at.alicdn.com/t/c/font_4263882_y9jng0gwthr.ttf?t=1695631530492') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-kaishi:before { + content: "\e6ad"; +} diff --git a/web/src/render/styles/reset.scss b/web/src/render/styles/reset.scss new file mode 100644 index 00000000..981aa5f0 --- /dev/null +++ b/web/src/render/styles/reset.scss @@ -0,0 +1,194 @@ +@charset "UTF-8"; + +* { + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body { + height: 100%; + font-family: "-apple-system", BlinkMacSystemFont, Droid Sans, Droid Sans Fallback, Helvetica Neue, Helvetica, Arial; +} + +html { + height: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; + font-size: 50px; +} + +* { + margin: 0; + padding: 0; + outline: none; +} + +input { + background-color: #fff; +} + +button, button:active, button:focus { + border: none; +} + +::-webkit-input-placeholder { + /* WebKit browsers */ + color: #ccc; + font-weight: normal; +} + +:-moz-placeholder { + /* Mozilla Firefox 4 to 18 */ + color: #ccc; + font-weight: normal; +} + +:-moz-placeholder { + /* Mozilla Firefox 19+ */ + color: #ccc; + font-weight: normal; +} + +:-ms-input-placeholder { + /* Internet Explorer 10+ */ + color: #ccc; + font-weight: normal; + font-family: inherit; +} + +textarea::-webkit-input-placeholder { + /* WebKit browsers */ + font-family: normal !important; +} + + +body { + font-family: Pingfang SC, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; + font-size: 14px; + line-height: 1.42857143; +} + +body, +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +code, +form, +fieldset, +legend, +input, +textarea, +p, +blockquote, +th, +td, +hr, +button, +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + margin: 0; + padding: 0; +} + +input, +select, +textarea { + font-size: 100%; +} + +input { + -webkit-appearance: none; +} + +input:-ms-clear { + display: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +fieldset, +img { + border: 0; +} + +abbr, +acronym { + border: 0; + font-variant: normal; +} + +del { + text-decoration: line-through; +} + +address, +caption, +cite, +code, +dfn, +em, +th, +var { + font-style: normal; + font-weight: 500; +} + +ol, +ul { + list-style: none; +} + +caption, +th { + text-align: left; +} + +a:hover { + text-decoration: none; +} + +a:active { + text-decoration: none; +} + +ins, +a { + text-decoration: none; +} + +.hidden { + display: none; +} + +* { + text-decoration: none; + box-sizing: border-box; +} + +a:hover * { + text-decoration: none; +} \ No newline at end of file diff --git a/web/src/render/styles/variable.scss b/web/src/render/styles/variable.scss new file mode 100644 index 00000000..553eaeff --- /dev/null +++ b/web/src/render/styles/variable.scss @@ -0,0 +1,15 @@ +$primary-color: #FA881A; +$primary-color-light: #FEF3E8; + +$title-color-deep: #292A36; +$title-color: #4A4C5B; +$font-color: #6E707C; + +$placeholder-color: #C8C9CD; + +$disable-color: #F2F4F7; +$border-color: #DEE2E6; + +$spliter-color: #f7f7f7; + +$error-color: #EC4E29; diff --git a/web/src/render/utils/index.js b/web/src/render/utils/index.js new file mode 100644 index 00000000..cb0ec650 --- /dev/null +++ b/web/src/render/utils/index.js @@ -0,0 +1,39 @@ +export function isMobile() { + const userAgentInfo = navigator.userAgent; + const Agents = [ + 'Android', + 'iPhone', + 'SymbianOS', + 'Windows Phone', + 'iPad', + 'iPod', + ]; + let flag = false; + for (let v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = true; + break; + } + } + const w = document.body && document.body.clientWidth; + + if (w > 960) { + return false; + } else if (w < 480) { + return true; + } else { + return flag; + } +} + +// 对链接做一个兼容转换,支持用户不配置http开头或者配置 // 开头 +export const formatLink = (url) => { + url = url.trim(); + if (!url) { + return url; + } + if (url.startsWith('http') || url.startsWith('//')) { + return url; + } + return `http://${url}`; +}; diff --git a/web/vue.config.js b/web/vue.config.js new file mode 100644 index 00000000..081cb853 --- /dev/null +++ b/web/vue.config.js @@ -0,0 +1,60 @@ +const { defineConfig } = require('@vue/cli-service'); + +module.exports = defineConfig({ + transpileDependencies: true, + lintOnSave: false, + pages: { + management: { + entry: `src/management/main.js`, + template: 'public/management.html', + filename: `management.html`, + title: '问卷调研', + }, + render: { + entry: `src/render/main.js`, + template: 'public/render.html', + filename: `render.html`, + title: '问卷调研', + }, + }, + css: { + loaderOptions: { + sass: { + additionalData: `@import "./src/management/styles/variable.scss";`, + }, + }, + }, + devServer: { + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true, + }, + }, + }, + chainWebpack: (config) => { + config.module + .rule('js') + .test(/\.jsx?$/) + .use('babel-loader') + .loader('babel-loader') + .end(); + + config.optimization.splitChunks({ + cacheGroups: { + setterWidgets: { + name: 'setterWidgets', + test: /\/setters\/src\/widgets[\\/]/, + chunks: 'async', + enforce: true, + }, + materialWidgets: { + name: 'materialWidgets', + test: /\/materials\/questions\/widgets[\\/]/, + chunks: 'async', + enforce: true, + }, + }, + }); + }, +}); diff --git a/web/yarn.lock b/web/yarn.lock new file mode 100644 index 00000000..7599cf28 --- /dev/null +++ b/web/yarn.lock @@ -0,0 +1,6939 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + "integrity" "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + "resolved" "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + "version" "1.2.6" + +"@achrinza/node-ipc@^9.2.5": + "integrity" "sha512-/EvNkqB4HNxPWCZASmgrjqG8gIdPOolD67LGASvGMp/FY5ne0rbvpYg5o9x8RmgjAl8KdmNQ4YlV1et9DYiW8g==" + "resolved" "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.7.tgz" + "version" "9.2.7" + dependencies: + "@node-ipc/js-queue" "2.0.3" + "event-pubsub" "4.3.0" + "js-message" "1.0.7" + +"@ampproject/remapping@^2.2.0": + "integrity" "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==" + "resolved" "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz" + "version" "2.2.1" + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.5": + "integrity" "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==" + "resolved" "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/code-frame@7.12.11": + "integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==" + "resolved" "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.12.11.tgz" + "version" "7.12.11" + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + "integrity" "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==" + "resolved" "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.9.tgz" + "version" "7.22.9" + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.12.16", "@babel/core@^7.13.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@>=7.11.0": + "integrity" "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==" + "resolved" "https://registry.npmmirror.com/@babel/core/-/core-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "convert-source-map" "^1.7.0" + "debug" "^4.1.0" + "gensync" "^1.0.0-beta.2" + "json5" "^2.2.2" + "semver" "^6.3.1" + +"@babel/eslint-parser@^7.12.16": + "integrity" "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==" + "resolved" "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + "eslint-visitor-keys" "^2.1.0" + "semver" "^6.3.1" + +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + "integrity" "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==" + "resolved" "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + "jsesc" "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + "integrity" "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + "integrity" "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + "integrity" "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + "browserslist" "^4.21.9" + "lru-cache" "^5.1.1" + "semver" "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6": + "integrity" "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "semver" "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + "integrity" "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "regexpu-core" "^5.3.1" + "semver" "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + "integrity" "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz" + "version" "0.4.2" + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "debug" "^4.1.1" + "lodash.debounce" "^4.0.8" + "resolve" "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + "integrity" "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" + "resolved" "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + "version" "7.22.5" + +"@babel/helper-function-name@^7.22.5": + "integrity" "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + "integrity" "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + "integrity" "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.22.5": + "integrity" "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + "integrity" "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + "integrity" "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + "integrity" "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + "version" "7.22.5" + +"@babel/helper-remap-async-to-generator@^7.22.5": + "integrity" "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + "integrity" "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==" + "resolved" "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + "integrity" "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==" + "resolved" "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + "integrity" "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==" + "resolved" "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + "integrity" "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==" + "resolved" "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + "version" "7.22.6" + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + "integrity" "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + "version" "7.22.5" + +"@babel/helper-validator-identifier@^7.22.5": + "integrity" "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + "resolved" "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + "version" "7.22.5" + +"@babel/helper-validator-option@^7.22.5": + "integrity" "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" + "resolved" "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + "version" "7.22.5" + +"@babel/helper-wrap-function@^7.22.9": + "integrity" "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==" + "resolved" "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + "integrity" "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==" + "resolved" "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.6.tgz" + "version" "7.22.6" + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.5": + "integrity" "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==" + "resolved" "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" + +"@babel/parser@^7.18.4", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + "integrity" "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" + "resolved" "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.7.tgz" + "version" "7.22.7" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + "integrity" "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + "integrity" "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.12.13": + "integrity" "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + "version" "7.18.6" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-decorators@^7.12.13": + "integrity" "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz" + "version" "7.22.7" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + "integrity" "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + "version" "7.21.0-placeholder-for-preset-env.2" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + "integrity" "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + "version" "7.18.6" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + "version" "7.8.4" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + "version" "7.12.13" + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + "version" "7.14.5" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.22.5": + "integrity" "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + "integrity" "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + "integrity" "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + "integrity" "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + "version" "7.10.4" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.22.5": + "integrity" "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + "version" "7.10.4" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + "version" "7.10.4" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + "version" "7.8.3" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + "version" "7.14.5" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + "version" "7.14.5" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + "integrity" "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + "version" "7.18.6" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + "integrity" "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + "integrity" "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz" + "version" "7.22.7" + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + "integrity" "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + "integrity" "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + "integrity" "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + "integrity" "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + "integrity" "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + "integrity" "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" + "version" "7.22.6" + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "globals" "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + "integrity" "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.5": + "integrity" "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + "integrity" "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + "integrity" "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + "integrity" "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + "integrity" "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + "integrity" "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.5": + "integrity" "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + "integrity" "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + "integrity" "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + "integrity" "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + "integrity" "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + "integrity" "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + "integrity" "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + "integrity" "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + "integrity" "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + "integrity" "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + "integrity" "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + "integrity" "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + "integrity" "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + "integrity" "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + "integrity" "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + "integrity" "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + "integrity" "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + "integrity" "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz" + "version" "7.22.6" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + "integrity" "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + "integrity" "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + "integrity" "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + "integrity" "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + "integrity" "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "regenerator-transform" "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + "integrity" "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.12.15": + "integrity" "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "babel-plugin-polyfill-corejs2" "^0.4.4" + "babel-plugin-polyfill-corejs3" "^0.8.2" + "babel-plugin-polyfill-regenerator" "^0.5.1" + "semver" "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + "integrity" "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + "integrity" "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + "integrity" "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + "integrity" "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + "integrity" "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + "integrity" "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + "integrity" "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + "integrity" "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + "integrity" "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==" + "resolved" "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.12.16": + "integrity" "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==" + "resolved" "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.22.9.tgz" + "version" "7.22.9" + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + "babel-plugin-polyfill-corejs2" "^0.4.4" + "babel-plugin-polyfill-corejs3" "^0.8.2" + "babel-plugin-polyfill-regenerator" "^0.5.1" + "core-js-compat" "^3.31.0" + "semver" "^6.3.1" + +"@babel/preset-modules@^0.1.5": + "integrity" "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==" + "resolved" "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz" + "version" "0.1.6" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + "esutils" "^2.0.2" + +"@babel/regjsgen@^0.8.0": + "integrity" "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "resolved" "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + "version" "0.8.0" + +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4": + "integrity" "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==" + "resolved" "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.6.tgz" + "version" "7.22.6" + dependencies: + "regenerator-runtime" "^0.13.11" + +"@babel/template@^7.22.5": + "integrity" "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==" + "resolved" "https://registry.npmmirror.com/@babel/template/-/template-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + "integrity" "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==" + "resolved" "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.8.tgz" + "version" "7.22.8" + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + "debug" "^4.1.0" + "globals" "^11.1.0" + +"@babel/types@^7.22.5", "@babel/types@^7.4.4": + "integrity" "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==" + "resolved" "https://registry.npmmirror.com/@babel/types/-/types-7.22.5.tgz" + "version" "7.22.5" + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "to-fast-properties" "^2.0.0" + +"@discoveryjs/json-ext@0.5.7": + "integrity" "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" + "resolved" "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + "version" "0.5.7" + +"@eslint/eslintrc@^0.4.3": + "integrity" "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==" + "resolved" "https://registry.npmmirror.com/@eslint/eslintrc/-/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" + +"@hapi/hoek@^9.0.0": + "integrity" "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + "resolved" "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz" + "version" "9.3.0" + +"@hapi/topo@^5.0.0": + "integrity" "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==" + "resolved" "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.5.0": + "integrity" "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==" + "resolved" "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-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" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "resolved" "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + "version" "1.2.1" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + "integrity" "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==" + "resolved" "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + "version" "0.3.3" + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + "resolved" "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + "version" "3.1.0" + +"@jridgewell/set-array@^1.0.1": + "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "resolved" "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz" + "version" "1.1.2" + +"@jridgewell/source-map@^0.3.3": + "integrity" "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==" + "resolved" "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz" + "version" "0.3.5" + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "resolved" "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + "version" "1.4.15" + +"@jridgewell/sourcemap-codec@1.4.14": + "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "resolved" "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + "version" "1.4.14" + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + "integrity" "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==" + "resolved" "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + "version" "0.3.18" + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + "integrity" "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "resolved" "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + "version" "2.0.4" + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + "integrity" "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==" + "resolved" "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" + "version" "5.1.1-v1" + dependencies: + "eslint-scope" "5.1.1" + +"@node-ipc/js-queue@2.0.3": + "integrity" "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==" + "resolved" "https://registry.npmmirror.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "easy-stack" "1.0.1" + +"@nodelib/fs.scandir@2.1.5": + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmmirror.com/@nodelib/fs.scandir/-/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" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" + +"@nodelib/fs.walk@^1.2.3": + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" + dependencies: + "@nodelib/fs.scandir" "2.1.5" + "fastq" "^1.6.0" + +"@polka/url@^1.0.0-next.20": + "integrity" "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + "resolved" "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.21.tgz" + "version" "1.0.0-next.21" + +"@sideway/address@^4.1.3": + "integrity" "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==" + "resolved" "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz" + "version" "4.1.4" + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + "integrity" "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + "resolved" "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz" + "version" "3.0.1" + +"@sideway/pinpoint@^2.0.0": + "integrity" "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + "resolved" "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + "version" "2.0.0" + +"@soda/friendly-errors-webpack-plugin@^1.8.0": + "integrity" "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==" + "resolved" "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz" + "version" "1.8.1" + dependencies: + "chalk" "^3.0.0" + "error-stack-parser" "^2.0.6" + "string-width" "^4.2.3" + "strip-ansi" "^6.0.1" + +"@soda/get-current-script@^1.0.2": + "integrity" "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==" + "resolved" "https://registry.npmmirror.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz" + "version" "1.0.2" + +"@transloadit/prettier-bytes@0.0.7": + "integrity" "sha1-zbU5n0Rf3WBu2DOHL6DKvbxRaGs=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40transloadit%2Fprettier-bytes%2F-%2Fprettier-bytes-0.0.7.tgz" + "version" "0.0.7" + +"@trysound/sax@0.2.0": + "integrity" "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + "resolved" "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz" + "version" "0.2.0" + +"@types/body-parser@*": + "integrity" "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==" + "resolved" "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz" + "version" "1.19.2" + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + "integrity" "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==" + "resolved" "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.10.tgz" + "version" "3.5.10" + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + "integrity" "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==" + "resolved" "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + "integrity" "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==" + "resolved" "https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz" + "version" "3.4.35" + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + "integrity" "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==" + "resolved" "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + "version" "3.7.4" + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + "integrity" "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==" + "resolved" "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.1.tgz" + "version" "8.44.1" + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + "integrity" "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "resolved" "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz" + "version" "1.0.1" + +"@types/event-emitter@^0.3.3": + "integrity" "sha1-cnAyqfxnVl+Wu9eLLigJJ1yX1+c=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@types/event-emitter/-/event-emitter-0.3.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fevent-emitter%2F-%2Fevent-emitter-0.3.3.tgz" + "version" "0.3.3" + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + "integrity" "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==" + "resolved" "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" + "version" "4.17.35" + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + "integrity" "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==" + "resolved" "https://registry.npmmirror.com/@types/express/-/express-4.17.17.tgz" + "version" "4.17.17" + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/html-minifier-terser@^6.0.0": + "integrity" "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + "resolved" "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + "version" "6.1.0" + +"@types/http-errors@*": + "integrity" "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + "resolved" "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.1.tgz" + "version" "2.0.1" + +"@types/http-proxy@^1.17.8": + "integrity" "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==" + "resolved" "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.11.tgz" + "version" "1.17.11" + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + "integrity" "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "resolved" "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz" + "version" "7.0.12" + +"@types/mime@*", "@types/mime@^1": + "integrity" "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "resolved" "https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz" + "version" "1.3.2" + +"@types/minimist@^1.2.0": + "integrity" "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" + "resolved" "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz" + "version" "1.2.2" + +"@types/node@*": + "integrity" "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==" + "resolved" "https://registry.npmmirror.com/@types/node/-/node-20.4.5.tgz" + "version" "20.4.5" + +"@types/normalize-package-data@^2.4.0": + "integrity" "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + "resolved" "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" + "version" "2.4.1" + +"@types/parse-json@^4.0.0": + "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "resolved" "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz" + "version" "4.0.0" + +"@types/qs@*": + "integrity" "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "resolved" "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz" + "version" "6.9.7" + +"@types/range-parser@*": + "integrity" "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "resolved" "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz" + "version" "1.2.4" + +"@types/retry@0.12.0": + "integrity" "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "resolved" "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz" + "version" "0.12.0" + +"@types/send@*": + "integrity" "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==" + "resolved" "https://registry.npmmirror.com/@types/send/-/send-0.17.1.tgz" + "version" "0.17.1" + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + "integrity" "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==" + "resolved" "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + "integrity" "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==" + "resolved" "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.2.tgz" + "version" "1.15.2" + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + "integrity" "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==" + "resolved" "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.33.tgz" + "version" "0.3.33" + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.5": + "integrity" "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==" + "resolved" "https://registry.npmmirror.com/@types/ws/-/ws-8.5.5.tgz" + "version" "8.5.5" + dependencies: + "@types/node" "*" + +"@uppy/companion-client@^2.2.2": + "integrity" "sha1-xwtC/cynKO+Is+6/fuPi+gS0kjs=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@uppy/companion-client/-/companion-client-2.2.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40uppy%2Fcompanion-client%2F-%2Fcompanion-client-2.2.2.tgz" + "version" "2.2.2" + dependencies: + "@uppy/utils" "^4.1.2" + "namespace-emitter" "^2.0.1" + +"@uppy/core@^2.0.3", "@uppy/core@^2.1.1", "@uppy/core@^2.1.4", "@uppy/core@^2.3.3": + "integrity" "sha1-JguFtr86oDzcZ9ojH4xpz7/cyEo=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@uppy/core/-/core-2.3.4.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40uppy%2Fcore%2F-%2Fcore-2.3.4.tgz" + "version" "2.3.4" + dependencies: + "@transloadit/prettier-bytes" "0.0.7" + "@uppy/store-default" "^2.1.1" + "@uppy/utils" "^4.1.3" + "lodash.throttle" "^4.1.1" + "mime-match" "^1.0.2" + "namespace-emitter" "^2.0.1" + "nanoid" "^3.1.25" + "preact" "^10.5.13" + +"@uppy/store-default@^2.1.1": + "integrity" "sha1-YqZWoJm9qgEjBuBU0JN1TLLTbj4=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@uppy/store-default/-/store-default-2.1.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40uppy%2Fstore-default%2F-%2Fstore-default-2.1.1.tgz" + "version" "2.1.1" + +"@uppy/utils@^4.1.2", "@uppy/utils@^4.1.3": + "integrity" "sha1-nQvm7OTfJfIo0w70C+DxQggljOM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@uppy/utils/-/utils-4.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40uppy%2Futils%2F-%2Futils-4.1.3.tgz" + "version" "4.1.3" + dependencies: + "lodash.throttle" "^4.1.1" + +"@uppy/xhr-upload@^2.0.3", "@uppy/xhr-upload@^2.0.7": + "integrity" "sha1-DU41UzL+DG6zctdzExXgTQKu6xg=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40uppy%2Fxhr-upload%2F-%2Fxhr-upload-2.1.3.tgz" + "version" "2.1.3" + dependencies: + "@uppy/companion-client" "^2.2.2" + "@uppy/utils" "^4.1.2" + "nanoid" "^3.1.25" + +"@vue/babel-helper-vue-jsx-merge-props@^1.4.0": + "integrity" "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==" + "resolved" "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz" + "version" "1.4.0" + +"@vue/babel-helper-vue-transform-on@^1.1.5": + "integrity" "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==" + "resolved" "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz" + "version" "1.1.5" + +"@vue/babel-plugin-jsx@^1.0.3": + "integrity" "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==" + "resolved" "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz" + "version" "1.1.5" + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@vue/babel-helper-vue-transform-on" "^1.1.5" + "camelcase" "^6.3.0" + "html-tags" "^3.3.1" + "svg-tags" "^1.0.0" + +"@vue/babel-plugin-transform-vue-jsx@^1.4.0": + "integrity" "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==" + "resolved" "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" + "html-tags" "^2.0.0" + "lodash.kebabcase" "^4.1.1" + "svg-tags" "^1.0.0" + +"@vue/babel-preset-app@^5.0.8": + "integrity" "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==" + "resolved" "https://registry.npmmirror.com/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz" + "version" "5.0.8" + dependencies: + "@babel/core" "^7.12.16" + "@babel/helper-compilation-targets" "^7.12.16" + "@babel/helper-module-imports" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-decorators" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/plugin-transform-runtime" "^7.12.15" + "@babel/preset-env" "^7.12.16" + "@babel/runtime" "^7.12.13" + "@vue/babel-plugin-jsx" "^1.0.3" + "@vue/babel-preset-jsx" "^1.1.2" + "babel-plugin-dynamic-import-node" "^2.3.3" + "core-js" "^3.8.3" + "core-js-compat" "^3.8.3" + "semver" "^7.3.4" + +"@vue/babel-preset-jsx@^1.1.2", "@vue/babel-preset-jsx@^1.4.0": + "integrity" "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==" + "resolved" "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" + "@vue/babel-sugar-composition-api-inject-h" "^1.4.0" + "@vue/babel-sugar-composition-api-render-instance" "^1.4.0" + "@vue/babel-sugar-functional-vue" "^1.4.0" + "@vue/babel-sugar-inject-h" "^1.4.0" + "@vue/babel-sugar-v-model" "^1.4.0" + "@vue/babel-sugar-v-on" "^1.4.0" + +"@vue/babel-sugar-composition-api-inject-h@^1.4.0": + "integrity" "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==" + "resolved" "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-composition-api-render-instance@^1.4.0": + "integrity" "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==" + "resolved" "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-functional-vue@^1.4.0": + "integrity" "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==" + "resolved" "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-inject-h@^1.4.0": + "integrity" "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==" + "resolved" "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-v-model@^1.4.0": + "integrity" "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==" + "resolved" "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" + "camelcase" "^5.0.0" + "html-tags" "^2.0.0" + "svg-tags" "^1.0.0" + +"@vue/babel-sugar-v-on@^1.4.0": + "integrity" "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==" + "resolved" "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" + "camelcase" "^5.0.0" + +"@vue/cli-overlay@^5.0.8": + "integrity" "sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ==" + "resolved" "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz" + "version" "5.0.8" + +"@vue/cli-plugin-babel@~5.0.0": + "integrity" "sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ==" + "resolved" "https://registry.npmmirror.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz" + "version" "5.0.8" + dependencies: + "@babel/core" "^7.12.16" + "@vue/babel-preset-app" "^5.0.8" + "@vue/cli-shared-utils" "^5.0.8" + "babel-loader" "^8.2.2" + "thread-loader" "^3.0.0" + "webpack" "^5.54.0" + +"@vue/cli-plugin-eslint@~5.0.0": + "integrity" "sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==" + "resolved" "https://registry.npmmirror.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz" + "version" "5.0.8" + dependencies: + "@vue/cli-shared-utils" "^5.0.8" + "eslint-webpack-plugin" "^3.1.0" + "globby" "^11.0.2" + "webpack" "^5.54.0" + "yorkie" "^2.0.0" + +"@vue/cli-plugin-router@^5.0.8", "@vue/cli-plugin-router@~5.0.0": + "integrity" "sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==" + "resolved" "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz" + "version" "5.0.8" + dependencies: + "@vue/cli-shared-utils" "^5.0.8" + +"@vue/cli-plugin-vuex@^5.0.8", "@vue/cli-plugin-vuex@~5.0.0": + "integrity" "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==" + "resolved" "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz" + "version" "5.0.8" + +"@vue/cli-service@^3.0.0 || ^4.0.0 || ^5.0.0-0", "@vue/cli-service@~5.0.0": + "integrity" "sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==" + "resolved" "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-5.0.8.tgz" + "version" "5.0.8" + dependencies: + "@babel/helper-compilation-targets" "^7.12.16" + "@soda/friendly-errors-webpack-plugin" "^1.8.0" + "@soda/get-current-script" "^1.0.2" + "@types/minimist" "^1.2.0" + "@vue/cli-overlay" "^5.0.8" + "@vue/cli-plugin-router" "^5.0.8" + "@vue/cli-plugin-vuex" "^5.0.8" + "@vue/cli-shared-utils" "^5.0.8" + "@vue/component-compiler-utils" "^3.3.0" + "@vue/vue-loader-v15" "npm:vue-loader@^15.9.7" + "@vue/web-component-wrapper" "^1.3.0" + "acorn" "^8.0.5" + "acorn-walk" "^8.0.2" + "address" "^1.1.2" + "autoprefixer" "^10.2.4" + "browserslist" "^4.16.3" + "case-sensitive-paths-webpack-plugin" "^2.3.0" + "cli-highlight" "^2.1.10" + "clipboardy" "^2.3.0" + "cliui" "^7.0.4" + "copy-webpack-plugin" "^9.0.1" + "css-loader" "^6.5.0" + "css-minimizer-webpack-plugin" "^3.0.2" + "cssnano" "^5.0.0" + "debug" "^4.1.1" + "default-gateway" "^6.0.3" + "dotenv" "^10.0.0" + "dotenv-expand" "^5.1.0" + "fs-extra" "^9.1.0" + "globby" "^11.0.2" + "hash-sum" "^2.0.0" + "html-webpack-plugin" "^5.1.0" + "is-file-esm" "^1.0.0" + "launch-editor-middleware" "^2.2.1" + "lodash.defaultsdeep" "^4.6.1" + "lodash.mapvalues" "^4.6.0" + "mini-css-extract-plugin" "^2.5.3" + "minimist" "^1.2.5" + "module-alias" "^2.2.2" + "portfinder" "^1.0.26" + "postcss" "^8.2.6" + "postcss-loader" "^6.1.1" + "progress-webpack-plugin" "^1.0.12" + "ssri" "^8.0.1" + "terser-webpack-plugin" "^5.1.1" + "thread-loader" "^3.0.0" + "vue-loader" "^17.0.0" + "vue-style-loader" "^4.1.3" + "webpack" "^5.54.0" + "webpack-bundle-analyzer" "^4.4.0" + "webpack-chain" "^6.5.1" + "webpack-dev-server" "^4.7.3" + "webpack-merge" "^5.7.3" + "webpack-virtual-modules" "^0.4.2" + "whatwg-fetch" "^3.6.2" + +"@vue/cli-shared-utils@^5.0.8": + "integrity" "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==" + "resolved" "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz" + "version" "5.0.8" + dependencies: + "@achrinza/node-ipc" "^9.2.5" + "chalk" "^4.1.2" + "execa" "^1.0.0" + "joi" "^17.4.0" + "launch-editor" "^2.2.1" + "lru-cache" "^6.0.0" + "node-fetch" "^2.6.7" + "open" "^8.0.2" + "ora" "^5.3.0" + "read-pkg" "^5.1.1" + "semver" "^7.3.4" + "strip-ansi" "^6.0.0" + +"@vue/compiler-sfc@2.7.14": + "integrity" "sha1-NEb9L7tnDXCSd/w/+ojvxeEChP0=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40vue%2Fcompiler-sfc%2F-%2Fcompiler-sfc-2.7.14.tgz" + "version" "2.7.14" + dependencies: + "@babel/parser" "^7.18.4" + "postcss" "^8.4.14" + "source-map" "^0.6.1" + +"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0": + "integrity" "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==" + "resolved" "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "consolidate" "^0.15.1" + "hash-sum" "^1.0.2" + "lru-cache" "^4.1.2" + "merge-source-map" "^1.1.0" + "postcss" "^7.0.36" + "postcss-selector-parser" "^6.0.2" + "source-map" "~0.6.1" + "vue-template-es2015-compiler" "^1.9.0" + optionalDependencies: + "prettier" "^1.18.2 || ^2.0.0" + +"@vue/vue-loader-v15@npm:vue-loader@^15.9.7": + "integrity" "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==" + "resolved" "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.10.1.tgz" + "version" "15.10.1" + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + "hash-sum" "^1.0.2" + "loader-utils" "^1.1.0" + "vue-hot-reload-api" "^2.3.0" + "vue-style-loader" "^4.1.0" + +"@vue/web-component-wrapper@^1.3.0": + "integrity" "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==" + "resolved" "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz" + "version" "1.3.0" + +"@wangeditor/basic-modules@^1.1.7", "@wangeditor/basic-modules@1.x": + "integrity" "sha1-qcPM9O9TMy8pVQ1Z02duFfOVlG8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Fbasic-modules%2F-%2Fbasic-modules-1.1.7.tgz" + "version" "1.1.7" + dependencies: + "is-url" "^1.2.4" + +"@wangeditor/code-highlight@^1.0.3": + "integrity" "sha1-kCVoV3FNXAz4OsR1rqZNt78pp80=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Fcode-highlight%2F-%2Fcode-highlight-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "prismjs" "^1.23.0" + +"@wangeditor/core@^1.1.19", "@wangeditor/core@1.x": + "integrity" "sha1-+RVff9ktA8sZgkBbO4LlTDHxwrA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/core/-/core-1.1.19.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Fcore%2F-%2Fcore-1.1.19.tgz" + "version" "1.1.19" + dependencies: + "@types/event-emitter" "^0.3.3" + "event-emitter" "^0.3.5" + "html-void-elements" "^2.0.0" + "i18next" "^20.4.0" + "scroll-into-view-if-needed" "^2.2.28" + "slate-history" "^0.66.0" + +"@wangeditor/editor-for-vue@^1.0.2": + "integrity" "sha1-YmdNVjVDGf+NzIPbXGLOxEN+6QY=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Feditor-for-vue%2F-%2Feditor-for-vue-1.0.2.tgz" + "version" "1.0.2" + +"@wangeditor/editor@^5.1.23", "@wangeditor/editor@>=5.1.0": + "integrity" "sha1-ydIAe3ywzu9rcmkrTuh7Ae4jZ7M=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/editor/-/editor-5.1.23.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Feditor%2F-%2Feditor-5.1.23.tgz" + "version" "5.1.23" + dependencies: + "@uppy/core" "^2.1.1" + "@uppy/xhr-upload" "^2.0.3" + "@wangeditor/basic-modules" "^1.1.7" + "@wangeditor/code-highlight" "^1.0.3" + "@wangeditor/core" "^1.1.19" + "@wangeditor/list-module" "^1.0.5" + "@wangeditor/table-module" "^1.1.4" + "@wangeditor/upload-image-module" "^1.0.2" + "@wangeditor/video-module" "^1.1.4" + "dom7" "^3.0.0" + "is-hotkey" "^0.2.0" + "lodash.camelcase" "^4.3.0" + "lodash.clonedeep" "^4.5.0" + "lodash.debounce" "^4.0.8" + "lodash.foreach" "^4.5.0" + "lodash.isequal" "^4.5.0" + "lodash.throttle" "^4.1.1" + "lodash.toarray" "^4.4.0" + "nanoid" "^3.2.0" + "slate" "^0.72.0" + "snabbdom" "^3.1.0" + +"@wangeditor/list-module@^1.0.5": + "integrity" "sha1-P8CxZ6zd+IVTa0X6DBJ/nGra6jM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/list-module/-/list-module-1.0.5.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Flist-module%2F-%2Flist-module-1.0.5.tgz" + "version" "1.0.5" + +"@wangeditor/table-module@^1.1.4": + "integrity" "sha1-dX1KWGiytlgEHNMjhUpNcHyDR+k=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/table-module/-/table-module-1.1.4.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Ftable-module%2F-%2Ftable-module-1.1.4.tgz" + "version" "1.1.4" + +"@wangeditor/upload-image-module@^1.0.2": + "integrity" "sha1-iem5Rn4Qy8axHcV0jgjdI6rr7jA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Fupload-image-module%2F-%2Fupload-image-module-1.0.2.tgz" + "version" "1.0.2" + +"@wangeditor/video-module@^1.1.4": + "integrity" "sha1-ud8bOrLNU/Z4sZtNkn4gB3Sm9TI=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/@wangeditor/video-module/-/video-module-1.1.4.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2F%40wangeditor%2Fvideo-module%2F-%2Fvideo-module-1.1.4.tgz" + "version" "1.1.4" + +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": + "integrity" "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + "integrity" "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + "version" "1.11.6" + +"@webassemblyjs/helper-api-error@1.11.6": + "integrity" "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + "version" "1.11.6" + +"@webassemblyjs/helper-buffer@1.11.6": + "integrity" "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + "version" "1.11.6" + +"@webassemblyjs/helper-numbers@1.11.6": + "integrity" "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + "integrity" "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + "version" "1.11.6" + +"@webassemblyjs/helper-wasm-section@1.11.6": + "integrity" "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + "integrity" "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + "integrity" "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + "integrity" "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + "version" "1.11.6" + +"@webassemblyjs/wasm-edit@^1.11.5": + "integrity" "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + "integrity" "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + "integrity" "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": + "integrity" "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + "integrity" "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==" + "resolved" "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + "version" "1.11.6" + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + "integrity" "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "resolved" "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + "version" "1.2.0" + +"@xtuc/long@4.2.2": + "integrity" "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "resolved" "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz" + "version" "4.2.2" + +"accepts@~1.3.4", "accepts@~1.3.5", "accepts@~1.3.8": + "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==" + "resolved" "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz" + "version" "1.3.8" + dependencies: + "mime-types" "~2.1.34" + "negotiator" "0.6.3" + +"acorn-import-assertions@^1.9.0": + "integrity" "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==" + "resolved" "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + "version" "1.9.0" + +"acorn-jsx@^5.3.1", "acorn-jsx@^5.3.2": + "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "resolved" "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + "version" "5.3.2" + +"acorn-walk@^8.0.0", "acorn-walk@^8.0.2": + "integrity" "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + "resolved" "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz" + "version" "8.2.0" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8", "acorn@^8.0.4", "acorn@^8.0.5", "acorn@^8.7.1", "acorn@^8.8.2", "acorn@^8.9.0": + "integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz" + "version" "8.10.0" + +"acorn@^7.4.0": + "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "resolved" "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz" + "version" "7.4.1" + +"address@^1.1.2": + "integrity" "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" + "resolved" "https://registry.npmmirror.com/address/-/address-1.2.2.tgz" + "version" "1.2.2" + +"ajv-formats@^2.1.1": + "integrity" "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==" + "resolved" "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "ajv" "^8.0.0" + +"ajv-keywords@^3.5.2": + "integrity" "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "resolved" "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + "version" "3.5.2" + +"ajv-keywords@^5.1.0": + "integrity" "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==" + "resolved" "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "fast-deep-equal" "^3.1.3" + +"ajv@^6.10.0", "ajv@^6.12.4", "ajv@^6.12.5", "ajv@^6.9.1": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmmirror.com/ajv/-/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.0": + "integrity" "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" + "resolved" "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz" + "version" "8.12.0" + dependencies: + "fast-deep-equal" "^3.1.1" + "json-schema-traverse" "^1.0.0" + "require-from-string" "^2.0.2" + "uri-js" "^4.2.2" + +"ajv@^8.0.1": + "integrity" "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" + "resolved" "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz" + "version" "8.12.0" + dependencies: + "fast-deep-equal" "^3.1.1" + "json-schema-traverse" "^1.0.0" + "require-from-string" "^2.0.2" + "uri-js" "^4.2.2" + +"ajv@^8.8.2", "ajv@^8.9.0": + "integrity" "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" + "resolved" "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz" + "version" "8.12.0" + 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" "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + "resolved" "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz" + "version" "4.1.3" + +"ansi-escapes@^3.0.0": + "integrity" "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "resolved" "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz" + "version" "3.2.0" + +"ansi-html-community@^0.0.8": + "integrity" "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + "resolved" "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + "version" "0.0.8" + +"ansi-regex@^3.0.0": + "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + "resolved" "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz" + "version" "3.0.1" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^4.0.0": + "integrity" "sha1-7dgDYornHATIWuegkG7a00tkiTc=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/ansi-styles/-/ansi-styles-4.3.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fansi-styles%2F-%2Fansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"any-promise@^1.0.0": + "integrity" "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "resolved" "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz" + "version" "1.3.0" + +"anymatch@~3.1.2": + "integrity" "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" + "resolved" "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz" + "version" "3.1.3" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"arch@^2.1.1": + "integrity" "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + "resolved" "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz" + "version" "2.2.0" + +"argparse@^1.0.7": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "sprintf-js" "~1.0.2" + +"array-flatten@^2.1.2": + "integrity" "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "resolved" "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz" + "version" "2.1.2" + +"array-flatten@1.1.1": + "integrity" "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "resolved" "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz" + "version" "1.1.1" + +"array-union@^2.1.0": + "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "resolved" "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz" + "version" "2.1.0" + +"astral-regex@^2.0.0": + "integrity" "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + "resolved" "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz" + "version" "2.0.0" + +"async-validator@~1.8.1": + "integrity" "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==" + "resolved" "https://r2.cnpmjs.org/async-validator/-/async-validator-1.8.5.tgz" + "version" "1.8.5" + dependencies: + "babel-runtime" "6.x" + +"async@^2.6.4": + "integrity" "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==" + "resolved" "https://registry.npmmirror.com/async/-/async-2.6.4.tgz" + "version" "2.6.4" + dependencies: + "lodash" "^4.17.14" + +"asynckit@^0.4.0": + "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/asynckit/-/asynckit-0.4.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fasynckit%2F-%2Fasynckit-0.4.0.tgz" + "version" "0.4.0" + +"at-least-node@^1.0.0": + "integrity" "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "resolved" "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz" + "version" "1.0.0" + +"autoprefixer@^10.2.4": + "integrity" "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==" + "resolved" "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.14.tgz" + "version" "10.4.14" + dependencies: + "browserslist" "^4.21.5" + "caniuse-lite" "^1.0.30001464" + "fraction.js" "^4.2.0" + "normalize-range" "^0.1.2" + "picocolors" "^1.0.0" + "postcss-value-parser" "^4.2.0" + +"axios@^1.4.0": + "integrity" "sha1-OKe/EiTNMI3icRRgOLVR1yXwvh8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/axios/-/axios-1.4.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Faxios%2F-%2Faxios-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "follow-redirects" "^1.15.0" + "form-data" "^4.0.0" + "proxy-from-env" "^1.1.0" + +"babel-helper-vue-jsx-merge-props@^2.0.0": + "integrity" "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + "resolved" "https://r2.cnpmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz" + "version" "2.0.3" + +"babel-loader@^8.2.2": + "integrity" "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==" + "resolved" "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz" + "version" "8.3.0" + dependencies: + "find-cache-dir" "^3.3.1" + "loader-utils" "^2.0.0" + "make-dir" "^3.1.0" + "schema-utils" "^2.6.5" + +"babel-plugin-dynamic-import-node@^2.3.3": + "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==" + "resolved" "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + "version" "2.3.3" + dependencies: + "object.assign" "^4.1.0" + +"babel-plugin-polyfill-corejs2@^0.4.4": + "integrity" "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==" + "resolved" "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz" + "version" "0.4.5" + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + "semver" "^6.3.1" + +"babel-plugin-polyfill-corejs3@^0.8.2": + "integrity" "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==" + "resolved" "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz" + "version" "0.8.3" + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + "core-js-compat" "^3.31.0" + +"babel-plugin-polyfill-regenerator@^0.5.1": + "integrity" "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==" + "resolved" "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz" + "version" "0.5.2" + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +"babel-runtime@6.x": + "integrity" "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==" + "resolved" "https://r2.cnpmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" + "version" "6.26.0" + dependencies: + "core-js" "^2.4.0" + "regenerator-runtime" "^0.11.0" + +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"base64-js@^1.3.1": + "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "resolved" "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz" + "version" "1.5.1" + +"batch@0.6.1": + "integrity" "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "resolved" "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz" + "version" "0.6.1" + +"big.js@^5.2.2": + "integrity" "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "resolved" "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz" + "version" "5.2.2" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"bl@^4.1.0": + "integrity" "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" + "resolved" "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "buffer" "^5.5.0" + "inherits" "^2.0.4" + "readable-stream" "^3.4.0" + +"bluebird@^3.1.1": + "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "resolved" "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz" + "version" "3.7.2" + +"body-parser@1.20.1": + "integrity" "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==" + "resolved" "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz" + "version" "1.20.1" + dependencies: + "bytes" "3.1.2" + "content-type" "~1.0.4" + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "http-errors" "2.0.0" + "iconv-lite" "0.4.24" + "on-finished" "2.4.1" + "qs" "6.11.0" + "raw-body" "2.5.1" + "type-is" "~1.6.18" + "unpipe" "1.0.0" + +"bonjour-service@^1.0.11": + "integrity" "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==" + "resolved" "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "array-flatten" "^2.1.2" + "dns-equal" "^1.0.0" + "fast-deep-equal" "^3.1.3" + "multicast-dns" "^7.2.5" + +"boolbase@^1.0.0": + "integrity" "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "resolved" "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz" + "version" "1.0.0" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.2", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browserslist@^4.0.0", "browserslist@^4.14.5", "browserslist@^4.16.3", "browserslist@^4.21.4", "browserslist@^4.21.5", "browserslist@^4.21.9", "browserslist@>= 4.21.0": + "integrity" "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==" + "resolved" "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.9.tgz" + "version" "4.21.9" + dependencies: + "caniuse-lite" "^1.0.30001503" + "electron-to-chromium" "^1.4.431" + "node-releases" "^2.0.12" + "update-browserslist-db" "^1.0.11" + +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" + +"buffer@^5.5.0": + "integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" + "resolved" "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz" + "version" "5.7.1" + dependencies: + "base64-js" "^1.3.1" + "ieee754" "^1.1.13" + +"bytes@3.0.0": + "integrity" "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + "resolved" "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz" + "version" "3.0.0" + +"bytes@3.1.2": + "integrity" "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "resolved" "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz" + "version" "3.1.2" + +"call-bind@^1.0.0", "call-bind@^1.0.2": + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + "resolved" "https://registry.npmmirror.com/call-bind/-/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" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"camel-case@^4.1.2": + "integrity" "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==" + "resolved" "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "pascal-case" "^3.1.2" + "tslib" "^2.0.3" + +"camelcase@^5.0.0": + "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "resolved" "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz" + "version" "5.3.1" + +"camelcase@^6.3.0": + "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "resolved" "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz" + "version" "6.3.0" + +"caniuse-api@^3.0.0": + "integrity" "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==" + "resolved" "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "browserslist" "^4.0.0" + "caniuse-lite" "^1.0.0" + "lodash.memoize" "^4.1.2" + "lodash.uniq" "^4.5.0" + +"caniuse-lite@^1.0.0", "caniuse-lite@^1.0.30001464", "caniuse-lite@^1.0.30001503": + "integrity" "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==" + "resolved" "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz" + "version" "1.0.30001517" + +"case-sensitive-paths-webpack-plugin@^2.3.0": + "integrity" "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" + "resolved" "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" + "version" "2.4.0" + +"chalk@^2.0.0", "chalk@^2.1.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmmirror.com/chalk/-/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@^3.0.0": + "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==" + "resolved" "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chalk@^4.0.0": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chalk@^4.1.0": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chalk@^4.1.2": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chokidar@^3.5.3", "chokidar@>=3.0.0 <4.0.0": + "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" + "resolved" "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz" + "version" "3.5.3" + 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" + +"chrome-trace-event@^1.0.2": + "integrity" "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + "resolved" "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + "version" "1.0.3" + +"ci-info@^1.5.0": + "integrity" "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "resolved" "https://registry.npmmirror.com/ci-info/-/ci-info-1.6.0.tgz" + "version" "1.6.0" + +"clean-css@^5.2.2": + "integrity" "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==" + "resolved" "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz" + "version" "5.3.2" + dependencies: + "source-map" "~0.6.0" + +"cli-cursor@^2.0.0": + "integrity" "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==" + "resolved" "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "restore-cursor" "^2.0.0" + +"cli-cursor@^3.1.0": + "integrity" "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" + "resolved" "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "restore-cursor" "^3.1.0" + +"cli-highlight@^2.1.10": + "integrity" "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==" + "resolved" "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz" + "version" "2.1.11" + dependencies: + "chalk" "^4.0.0" + "highlight.js" "^10.7.1" + "mz" "^2.4.0" + "parse5" "^5.1.1" + "parse5-htmlparser2-tree-adapter" "^6.0.0" + "yargs" "^16.0.0" + +"cli-spinners@^2.5.0": + "integrity" "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==" + "resolved" "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.0.tgz" + "version" "2.9.0" + +"clipboard@^2.0.11": + "integrity" "sha1-YhgDYLl91mi2s6hOwiaXV2KnC+U=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/clipboard/-/clipboard-2.0.11.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fclipboard%2F-%2Fclipboard-2.0.11.tgz" + "version" "2.0.11" + dependencies: + "good-listener" "^1.2.2" + "select" "^1.1.2" + "tiny-emitter" "^2.0.0" + +"clipboardy@^2.3.0": + "integrity" "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==" + "resolved" "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "arch" "^2.1.1" + "execa" "^1.0.0" + "is-wsl" "^2.1.1" + +"cliui@^6.0.0": + "integrity" "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/cliui/-/cliui-6.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcliui%2F-%2Fcliui-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "string-width" "^4.2.0" + "strip-ansi" "^6.0.0" + "wrap-ansi" "^6.2.0" + +"cliui@^7.0.2", "cliui@^7.0.4": + "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" + "resolved" "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz" + "version" "7.0.4" + dependencies: + "string-width" "^4.2.0" + "strip-ansi" "^6.0.0" + "wrap-ansi" "^7.0.0" + +"clone-deep@^4.0.1": + "integrity" "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==" + "resolved" "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "is-plain-object" "^2.0.4" + "kind-of" "^6.0.2" + "shallow-clone" "^3.0.0" + +"clone@^1.0.2": + "integrity" "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + "resolved" "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz" + "version" "1.0.4" + +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"colord@^2.9.1": + "integrity" "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + "resolved" "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz" + "version" "2.9.3" + +"colorette@^2.0.10": + "integrity" "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "resolved" "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz" + "version" "2.0.20" + +"combined-stream@^1.0.8": + "integrity" "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/combined-stream/-/combined-stream-1.0.8.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcombined-stream%2F-%2Fcombined-stream-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "delayed-stream" "~1.0.0" + +"commander@^2.20.0": + "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz" + "version" "2.20.3" + +"commander@^2.20.3": + "integrity" "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/commander/-/commander-2.20.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcommander%2F-%2Fcommander-2.20.3.tgz" + "version" "2.20.3" + +"commander@^7.2.0": + "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz" + "version" "7.2.0" + +"commander@^8.3.0": + "integrity" "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "resolved" "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz" + "version" "8.3.0" + +"commondir@^1.0.1": + "integrity" "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + "resolved" "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz" + "version" "1.0.1" + +"compressible@~2.0.16": + "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==" + "resolved" "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz" + "version" "2.0.18" + dependencies: + "mime-db" ">= 1.43.0 < 2" + +"compression@^1.7.4": + "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==" + "resolved" "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz" + "version" "1.7.4" + dependencies: + "accepts" "~1.3.5" + "bytes" "3.0.0" + "compressible" "~2.0.16" + "debug" "2.6.9" + "on-headers" "~1.0.2" + "safe-buffer" "5.1.2" + "vary" "~1.1.2" + +"compute-scroll-into-view@^1.0.20": + "integrity" "sha1-F2i1Ui0RcnVPXQybAt469r5QakM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcompute-scroll-into-view%2F-%2Fcompute-scroll-into-view-1.0.20.tgz" + "version" "1.0.20" + +"concat-map@0.0.1": + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"connect-history-api-fallback@^2.0.0": + "integrity" "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + "resolved" "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + "version" "2.0.0" + +"consolidate@^0.15.1": + "integrity" "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==" + "resolved" "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz" + "version" "0.15.1" + dependencies: + "bluebird" "^3.1.1" + +"content-disposition@0.5.4": + "integrity" "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==" + "resolved" "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz" + "version" "0.5.4" + dependencies: + "safe-buffer" "5.2.1" + +"content-type@~1.0.4": + "integrity" "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + "resolved" "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz" + "version" "1.0.5" + +"convert-source-map@^1.7.0": + "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "resolved" "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz" + "version" "1.9.0" + +"cookie-signature@1.0.6": + "integrity" "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "resolved" "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz" + "version" "1.0.6" + +"cookie@0.5.0": + "integrity" "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "resolved" "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz" + "version" "0.5.0" + +"copy-webpack-plugin@^9.0.1": + "integrity" "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==" + "resolved" "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz" + "version" "9.1.0" + dependencies: + "fast-glob" "^3.2.7" + "glob-parent" "^6.0.1" + "globby" "^11.0.3" + "normalize-path" "^3.0.0" + "schema-utils" "^3.1.1" + "serialize-javascript" "^6.0.0" + +"core-js-compat@^3.31.0", "core-js-compat@^3.8.3": + "integrity" "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==" + "resolved" "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.32.0.tgz" + "version" "3.32.0" + dependencies: + "browserslist" "^4.21.9" + +"core-js@^2.4.0": + "integrity" "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "resolved" "https://r2.cnpmjs.org/core-js/-/core-js-2.6.12.tgz" + "version" "2.6.12" + +"core-js@^3.8.3": + "integrity" "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==" + "resolved" "https://registry.npmmirror.com/core-js/-/core-js-3.32.0.tgz" + "version" "3.32.0" + +"core-util-is@~1.0.0": + "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "resolved" "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz" + "version" "1.0.3" + +"cosmiconfig@^7.0.0": + "integrity" "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==" + "resolved" "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + "version" "7.1.0" + dependencies: + "@types/parse-json" "^4.0.0" + "import-fresh" "^3.2.1" + "parse-json" "^5.0.0" + "path-type" "^4.0.0" + "yaml" "^1.10.0" + +"cross-spawn@^5.0.1": + "integrity" "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==" + "resolved" "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "lru-cache" "^4.0.1" + "shebang-command" "^1.2.0" + "which" "^1.2.9" + +"cross-spawn@^6.0.0": + "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==" + "resolved" "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz" + "version" "6.0.5" + dependencies: + "nice-try" "^1.0.4" + "path-key" "^2.0.1" + "semver" "^5.5.0" + "shebang-command" "^1.2.0" + "which" "^1.2.9" + +"cross-spawn@^7.0.2": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmmirror.com/cross-spawn/-/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" + +"cross-spawn@^7.0.3": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmmirror.com/cross-spawn/-/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" + +"crypto-js@^4.1.1": + "integrity" "sha1-nkhbzwNSEEG9hYRHhrg/t2GXNs8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/crypto-js/-/crypto-js-4.1.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcrypto-js%2F-%2Fcrypto-js-4.1.1.tgz" + "version" "4.1.1" + +"css-declaration-sorter@^6.3.1": + "integrity" "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==" + "resolved" "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz" + "version" "6.4.1" + +"css-loader@*", "css-loader@^6.5.0": + "integrity" "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==" + "resolved" "https://registry.npmmirror.com/css-loader/-/css-loader-6.8.1.tgz" + "version" "6.8.1" + dependencies: + "icss-utils" "^5.1.0" + "postcss" "^8.4.21" + "postcss-modules-extract-imports" "^3.0.0" + "postcss-modules-local-by-default" "^4.0.3" + "postcss-modules-scope" "^3.0.0" + "postcss-modules-values" "^4.0.0" + "postcss-value-parser" "^4.2.0" + "semver" "^7.3.8" + +"css-minimizer-webpack-plugin@^3.0.2": + "integrity" "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==" + "resolved" "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" + "version" "3.4.1" + dependencies: + "cssnano" "^5.0.6" + "jest-worker" "^27.0.2" + "postcss" "^8.3.5" + "schema-utils" "^4.0.0" + "serialize-javascript" "^6.0.0" + "source-map" "^0.6.1" + +"css-select@^4.1.3": + "integrity" "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==" + "resolved" "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "boolbase" "^1.0.0" + "css-what" "^6.0.1" + "domhandler" "^4.3.1" + "domutils" "^2.8.0" + "nth-check" "^2.0.1" + +"css-tree@^1.1.2", "css-tree@^1.1.3": + "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==" + "resolved" "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "mdn-data" "2.0.14" + "source-map" "^0.6.1" + +"css-what@^6.0.1": + "integrity" "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + "resolved" "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz" + "version" "6.1.0" + +"cssesc@^3.0.0": + "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "resolved" "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz" + "version" "3.0.0" + +"cssfilter@0.0.10": + "integrity" "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/cssfilter/-/cssfilter-0.0.10.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcssfilter%2F-%2Fcssfilter-0.0.10.tgz" + "version" "0.0.10" + +"cssnano-preset-default@^5.2.14": + "integrity" "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==" + "resolved" "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" + "version" "5.2.14" + dependencies: + "css-declaration-sorter" "^6.3.1" + "cssnano-utils" "^3.1.0" + "postcss-calc" "^8.2.3" + "postcss-colormin" "^5.3.1" + "postcss-convert-values" "^5.1.3" + "postcss-discard-comments" "^5.1.2" + "postcss-discard-duplicates" "^5.1.0" + "postcss-discard-empty" "^5.1.1" + "postcss-discard-overridden" "^5.1.0" + "postcss-merge-longhand" "^5.1.7" + "postcss-merge-rules" "^5.1.4" + "postcss-minify-font-values" "^5.1.0" + "postcss-minify-gradients" "^5.1.1" + "postcss-minify-params" "^5.1.4" + "postcss-minify-selectors" "^5.2.1" + "postcss-normalize-charset" "^5.1.0" + "postcss-normalize-display-values" "^5.1.0" + "postcss-normalize-positions" "^5.1.1" + "postcss-normalize-repeat-style" "^5.1.1" + "postcss-normalize-string" "^5.1.0" + "postcss-normalize-timing-functions" "^5.1.0" + "postcss-normalize-unicode" "^5.1.1" + "postcss-normalize-url" "^5.1.0" + "postcss-normalize-whitespace" "^5.1.1" + "postcss-ordered-values" "^5.1.3" + "postcss-reduce-initial" "^5.1.2" + "postcss-reduce-transforms" "^5.1.0" + "postcss-svgo" "^5.1.0" + "postcss-unique-selectors" "^5.1.1" + +"cssnano-utils@^3.1.0": + "integrity" "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + "resolved" "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + "version" "3.1.0" + +"cssnano@^5.0.0", "cssnano@^5.0.6": + "integrity" "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==" + "resolved" "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.15.tgz" + "version" "5.1.15" + dependencies: + "cssnano-preset-default" "^5.2.14" + "lilconfig" "^2.0.3" + "yaml" "^1.10.2" + +"csso@^4.2.0": + "integrity" "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==" + "resolved" "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "css-tree" "^1.1.2" + +"csstype@^3.1.0": + "integrity" "sha1-HUv51XLxHBQDHwQ24cELwfVx9Qs=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/csstype/-/csstype-3.1.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcsstype%2F-%2Fcsstype-3.1.2.tgz" + "version" "3.1.2" + +"cuint@^0.2.2": + "integrity" "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/cuint/-/cuint-0.2.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fcuint%2F-%2Fcuint-0.2.2.tgz" + "version" "0.2.2" + +"d@^1.0.1", "d@1": + "integrity" "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/d/-/d-1.0.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fd%2F-%2Fd-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "es5-ext" "^0.10.50" + "type" "^1.0.1" + +"de-indent@^1.0.2": + "integrity" "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" + "resolved" "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz" + "version" "1.0.2" + +"debug@^3.2.7": + "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" + "resolved" "https://registry.npmmirror.com/debug/-/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": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"debug@2.6.9": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + +"decamelize@^1.2.0": + "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fdecamelize%2F-%2Fdecamelize-1.2.0.tgz" + "version" "1.2.0" + +"deep-is@^0.1.3": + "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "resolved" "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz" + "version" "0.1.4" + +"deepmerge@^1.2.0", "deepmerge@^1.5.2": + "integrity" "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + "resolved" "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz" + "version" "1.5.2" + +"default-gateway@^6.0.3": + "integrity" "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==" + "resolved" "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz" + "version" "6.0.3" + dependencies: + "execa" "^5.0.0" + +"defaults@^1.0.3": + "integrity" "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==" + "resolved" "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "clone" "^1.0.2" + +"define-lazy-prop@^2.0.0": + "integrity" "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + "resolved" "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + "version" "2.0.0" + +"define-properties@^1.1.4": + "integrity" "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==" + "resolved" "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "has-property-descriptors" "^1.0.0" + "object-keys" "^1.1.1" + +"delayed-stream@~1.0.0": + "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/delayed-stream/-/delayed-stream-1.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fdelayed-stream%2F-%2Fdelayed-stream-1.0.0.tgz" + "version" "1.0.0" + +"delegate@^3.1.2": + "integrity" "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/delegate/-/delegate-3.2.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fdelegate%2F-%2Fdelegate-3.2.0.tgz" + "version" "3.2.0" + +"depd@~1.1.2": + "integrity" "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + "resolved" "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz" + "version" "1.1.2" + +"depd@2.0.0": + "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "resolved" "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz" + "version" "2.0.0" + +"destroy@1.2.0": + "integrity" "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "resolved" "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz" + "version" "1.2.0" + +"detect-node@^2.0.4": + "integrity" "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "resolved" "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz" + "version" "2.1.0" + +"dijkstrajs@^1.0.1": + "integrity" "sha1-TI296h8PZHi/+U2cSceE1iPk/CM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/dijkstrajs/-/dijkstrajs-1.0.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fdijkstrajs%2F-%2Fdijkstrajs-1.0.3.tgz" + "version" "1.0.3" + +"dir-glob@^3.0.1": + "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + "resolved" "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "path-type" "^4.0.0" + +"dns-equal@^1.0.0": + "integrity" "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + "resolved" "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz" + "version" "1.0.0" + +"dns-packet@^5.2.2": + "integrity" "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==" + "resolved" "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.0.tgz" + "version" "5.6.0" + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +"doctrine@^3.0.0": + "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + "resolved" "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "esutils" "^2.0.2" + +"dom-converter@^0.2.0": + "integrity" "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==" + "resolved" "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "utila" "~0.4" + +"dom-serializer@^1.0.1": + "integrity" "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==" + "resolved" "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz" + "version" "1.4.1" + dependencies: + "domelementtype" "^2.0.1" + "domhandler" "^4.2.0" + "entities" "^2.0.0" + +"dom7@^3.0.0": + "integrity" "sha1-uGHOXWemvs16qjrQKUL/FLEkAzE=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/dom7/-/dom7-3.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fdom7%2F-%2Fdom7-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "ssr-window" "^3.0.0-alpha.1" + +"domelementtype@^2.0.1", "domelementtype@^2.2.0": + "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + "resolved" "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz" + "version" "2.3.0" + +"domhandler@^4.0.0", "domhandler@^4.2.0", "domhandler@^4.3.1": + "integrity" "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==" + "resolved" "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz" + "version" "4.3.1" + dependencies: + "domelementtype" "^2.2.0" + +"domutils@^2.5.2", "domutils@^2.8.0": + "integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==" + "resolved" "https://registry.npmmirror.com/domutils/-/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" "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==" + "resolved" "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "no-case" "^3.0.4" + "tslib" "^2.0.3" + +"dotenv-expand@^5.1.0": + "integrity" "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + "resolved" "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz" + "version" "5.1.0" + +"dotenv@^10.0.0": + "integrity" "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + "resolved" "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz" + "version" "10.0.0" + +"duplexer@^0.1.2": + "integrity" "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "resolved" "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz" + "version" "0.1.2" + +"easy-stack@1.0.1": + "integrity" "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==" + "resolved" "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz" + "version" "1.0.1" + +"ee-first@1.1.1": + "integrity" "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "resolved" "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz" + "version" "1.1.1" + +"electron-to-chromium@^1.4.431": + "integrity" "sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A==" + "resolved" "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.475.tgz" + "version" "1.4.475" + +"element-ui@^2.15.13": + "integrity" "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==" + "resolved" "https://r.cnpmjs.org/element-ui/-/element-ui-2.15.13.tgz" + "version" "2.15.13" + dependencies: + "async-validator" "~1.8.1" + "babel-helper-vue-jsx-merge-props" "^2.0.0" + "deepmerge" "^1.2.0" + "normalize-wheel" "^1.0.1" + "resize-observer-polyfill" "^1.5.0" + "throttle-debounce" "^1.0.1" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"emojis-list@^3.0.0": + "integrity" "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "resolved" "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz" + "version" "3.0.0" + +"encode-utf8@^1.0.3": + "integrity" "sha1-8w/dMdoH+1lvKBvrL2sCeFGZTNo=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/encode-utf8/-/encode-utf8-1.0.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fencode-utf8%2F-%2Fencode-utf8-1.0.3.tgz" + "version" "1.0.3" + +"encodeurl@~1.0.2": + "integrity" "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "resolved" "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz" + "version" "1.0.2" + +"end-of-stream@^1.1.0": + "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" + "resolved" "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz" + "version" "1.4.4" + dependencies: + "once" "^1.4.0" + +"enhanced-resolve@^5.15.0": + "integrity" "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==" + "resolved" "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" + "version" "5.15.0" + dependencies: + "graceful-fs" "^4.2.4" + "tapable" "^2.2.0" + +"enquirer@^2.3.5": + "integrity" "sha512-ehu97t6FTYK2I3ZYtnp0BZ9vt0mvEL/cnHBds7Ct6jo9VX1VIkiFhOvVRWh6eblQqd7KOoICIQV+syZ3neXO/Q==" + "resolved" "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.0.tgz" + "version" "2.4.0" + dependencies: + "ansi-colors" "^4.1.1" + "strip-ansi" "^6.0.1" + +"entities@^2.0.0": + "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "resolved" "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz" + "version" "2.2.0" + +"error-ex@^1.3.1": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "^0.2.1" + +"error-stack-parser@^2.0.6": + "integrity" "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==" + "resolved" "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz" + "version" "2.1.4" + dependencies: + "stackframe" "^1.3.4" + +"es-module-lexer@^1.2.1": + "integrity" "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "resolved" "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz" + "version" "1.3.0" + +"es5-ext@^0.10.35", "es5-ext@^0.10.50", "es5-ext@~0.10.14": + "integrity" "sha1-XmrcGabaUkvz0eArvIlg5etJqaU=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/es5-ext/-/es5-ext-0.10.62.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fes5-ext%2F-%2Fes5-ext-0.10.62.tgz" + "version" "0.10.62" + dependencies: + "es6-iterator" "^2.0.3" + "es6-symbol" "^3.1.3" + "next-tick" "^1.1.0" + +"es6-iterator@^2.0.3": + "integrity" "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/es6-iterator/-/es6-iterator-2.0.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fes6-iterator%2F-%2Fes6-iterator-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "d" "1" + "es5-ext" "^0.10.35" + "es6-symbol" "^3.1.1" + +"es6-symbol@^3.1.1", "es6-symbol@^3.1.3": + "integrity" "sha1-utXTwbzawoJp9MszHkMceKxwXRg=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/es6-symbol/-/es6-symbol-3.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fes6-symbol%2F-%2Fes6-symbol-3.1.3.tgz" + "version" "3.1.3" + dependencies: + "d" "^1.0.1" + "ext" "^1.1.2" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-html@~1.0.3": + "integrity" "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "resolved" "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz" + "version" "1.0.3" + +"escape-string-regexp@^1.0.5": + "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"escape-string-regexp@^4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" + +"eslint-config-prettier@^8.3.0": + "integrity" "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==" + "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" + "version" "8.10.0" + +"eslint-plugin-prettier@^4.0.0": + "integrity" "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==" + "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + "version" "4.2.1" + dependencies: + "prettier-linter-helpers" "^1.0.0" + +"eslint-plugin-vue@^8.7.1": + "integrity" "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==" + "resolved" "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz" + "version" "8.7.1" + dependencies: + "eslint-utils" "^3.0.0" + "natural-compare" "^1.4.0" + "nth-check" "^2.0.1" + "postcss-selector-parser" "^6.0.9" + "semver" "^7.3.5" + "vue-eslint-parser" "^8.0.1" + +"eslint-scope@^5.1.1", "eslint-scope@5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" + +"eslint-scope@^7.0.0": + "integrity" "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==" + "resolved" "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.1.tgz" + "version" "7.2.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^5.2.0" + +"eslint-utils@^2.1.0": + "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" + "resolved" "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "eslint-visitor-keys" "^1.1.0" + +"eslint-utils@^3.0.0": + "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" + "resolved" "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "eslint-visitor-keys" "^2.0.0" + +"eslint-visitor-keys@^1.1.0": + "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + "version" "1.3.0" + +"eslint-visitor-keys@^1.3.0": + "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + "version" "1.3.0" + +"eslint-visitor-keys@^2.0.0", "eslint-visitor-keys@^2.1.0": + "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + "version" "2.1.0" + +"eslint-visitor-keys@^3.1.0", "eslint-visitor-keys@^3.4.1": + "integrity" "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" + "resolved" "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + "version" "3.4.1" + +"eslint-webpack-plugin@^3.1.0": + "integrity" "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==" + "resolved" "https://registry.npmmirror.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + "jest-worker" "^28.0.2" + "micromatch" "^4.0.5" + "normalize-path" "^3.0.0" + "schema-utils" "^4.0.0" + +"eslint@^6.2.0 || ^7.0.0 || ^8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.32.0", "eslint@^7.5.0 || ^8.0.0", "eslint@>=5", "eslint@>=6.0.0", "eslint@>=7.0.0", "eslint@>=7.28.0", "eslint@>=7.5.0": + "integrity" "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==" + "resolved" "https://registry.npmjs.org/eslint/-/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@^7.3.0", "espree@^7.3.1": + "integrity" "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==" + "resolved" "https://registry.npmmirror.com/espree/-/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" + +"espree@^9.0.0": + "integrity" "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==" + "resolved" "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz" + "version" "9.6.1" + dependencies: + "acorn" "^8.9.0" + "acorn-jsx" "^5.3.2" + "eslint-visitor-keys" "^3.4.1" + +"esprima@^4.0.0": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" + +"esquery@^1.4.0": + "integrity" "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==" + "resolved" "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "estraverse" "^5.1.0" + +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" + +"estraverse@^5.1.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" + +"estraverse@^5.2.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" + +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"etag@~1.8.1": + "integrity" "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "resolved" "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz" + "version" "1.8.1" + +"event-emitter@^0.3.5": + "integrity" "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/event-emitter/-/event-emitter-0.3.5.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fevent-emitter%2F-%2Fevent-emitter-0.3.5.tgz" + "version" "0.3.5" + dependencies: + "d" "1" + "es5-ext" "~0.10.14" + +"event-pubsub@4.3.0": + "integrity" "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==" + "resolved" "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz" + "version" "4.3.0" + +"eventemitter3@^4.0.0": + "integrity" "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "resolved" "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz" + "version" "4.0.7" + +"events@^3.2.0": + "integrity" "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "resolved" "https://registry.npmmirror.com/events/-/events-3.3.0.tgz" + "version" "3.3.0" + +"execa@^0.8.0": + "integrity" "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==" + "resolved" "https://registry.npmmirror.com/execa/-/execa-0.8.0.tgz" + "version" "0.8.0" + dependencies: + "cross-spawn" "^5.0.1" + "get-stream" "^3.0.0" + "is-stream" "^1.1.0" + "npm-run-path" "^2.0.0" + "p-finally" "^1.0.0" + "signal-exit" "^3.0.0" + "strip-eof" "^1.0.0" + +"execa@^1.0.0": + "integrity" "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==" + "resolved" "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "cross-spawn" "^6.0.0" + "get-stream" "^4.0.0" + "is-stream" "^1.1.0" + "npm-run-path" "^2.0.0" + "p-finally" "^1.0.0" + "signal-exit" "^3.0.0" + "strip-eof" "^1.0.0" + +"execa@^5.0.0": + "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" + "resolved" "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "cross-spawn" "^7.0.3" + "get-stream" "^6.0.0" + "human-signals" "^2.1.0" + "is-stream" "^2.0.0" + "merge-stream" "^2.0.0" + "npm-run-path" "^4.0.1" + "onetime" "^5.1.2" + "signal-exit" "^3.0.3" + "strip-final-newline" "^2.0.0" + +"express@^4.17.3": + "integrity" "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==" + "resolved" "https://registry.npmmirror.com/express/-/express-4.18.2.tgz" + "version" "4.18.2" + dependencies: + "accepts" "~1.3.8" + "array-flatten" "1.1.1" + "body-parser" "1.20.1" + "content-disposition" "0.5.4" + "content-type" "~1.0.4" + "cookie" "0.5.0" + "cookie-signature" "1.0.6" + "debug" "2.6.9" + "depd" "2.0.0" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "etag" "~1.8.1" + "finalhandler" "1.2.0" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "merge-descriptors" "1.0.1" + "methods" "~1.1.2" + "on-finished" "2.4.1" + "parseurl" "~1.3.3" + "path-to-regexp" "0.1.7" + "proxy-addr" "~2.0.7" + "qs" "6.11.0" + "range-parser" "~1.2.1" + "safe-buffer" "5.2.1" + "send" "0.18.0" + "serve-static" "1.15.0" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "type-is" "~1.6.18" + "utils-merge" "1.0.1" + "vary" "~1.1.2" + +"ext@^1.1.2": + "integrity" "sha1-DqQ4PAED1g5wvpnpp/EQJ6M8T18=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/ext/-/ext-1.7.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fext%2F-%2Fext-1.7.0.tgz" + "version" "1.7.0" + dependencies: + "type" "^2.7.2" + +"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-diff@^1.1.2": + "integrity" "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + "version" "1.3.0" + +"fast-glob@^3.2.7", "fast-glob@^3.2.9": + "integrity" "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==" + "resolved" "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz" + "version" "3.3.1" + 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" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-levenshtein@^2.0.6": + "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "resolved" "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + "version" "2.0.6" + +"fastq@^1.6.0": + "integrity" "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==" + "resolved" "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "reusify" "^1.0.4" + +"faye-websocket@^0.11.3": + "integrity" "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==" + "resolved" "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz" + "version" "0.11.4" + dependencies: + "websocket-driver" ">=0.5.1" + +"figures@^2.0.0": + "integrity" "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==" + "resolved" "https://registry.npmmirror.com/figures/-/figures-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "escape-string-regexp" "^1.0.5" + +"file-entry-cache@^6.0.1": + "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" + "resolved" "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "flat-cache" "^3.0.4" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"finalhandler@1.2.0": + "integrity" "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==" + "resolved" "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "debug" "2.6.9" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "on-finished" "2.4.1" + "parseurl" "~1.3.3" + "statuses" "2.0.1" + "unpipe" "~1.0.0" + +"find-cache-dir@^3.3.1": + "integrity" "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==" + "resolved" "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + "version" "3.3.2" + dependencies: + "commondir" "^1.0.1" + "make-dir" "^3.0.2" + "pkg-dir" "^4.1.0" + +"find-up@^4.0.0", "find-up@^4.1.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" + +"flat-cache@^3.0.4": + "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + "resolved" "https://registry.npmmirror.com/flat-cache/-/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-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "resolved" "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz" + "version" "3.2.7" + +"follow-redirects@^1.0.0", "follow-redirects@^1.15.0": + "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "resolved" "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz" + "version" "1.15.2" + +"form-data@^4.0.0": + "integrity" "sha1-k5Gdrq82HuUpWEubMWZNwSyfpFI=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/form-data/-/form-data-4.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fform-data%2F-%2Fform-data-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "asynckit" "^0.4.0" + "combined-stream" "^1.0.8" + "mime-types" "^2.1.12" + +"forwarded@0.2.0": + "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "resolved" "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz" + "version" "0.2.0" + +"fraction.js@^4.2.0": + "integrity" "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + "resolved" "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz" + "version" "4.2.0" + +"fresh@0.5.2": + "integrity" "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "resolved" "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz" + "version" "0.5.2" + +"fs-extra@^9.1.0": + "integrity" "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==" + "resolved" "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" + "version" "9.1.0" + dependencies: + "at-least-node" "^1.0.0" + "graceful-fs" "^4.2.0" + "jsonfile" "^6.0.1" + "universalify" "^2.0.0" + +"fs-monkey@^1.0.4": + "integrity" "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + "resolved" "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.4.tgz" + "version" "1.0.4" + +"fs.realpath@^1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"fsevents@~2.3.2": + "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" + "resolved" "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz" + "version" "2.3.2" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"functional-red-black-tree@^1.0.1": + "integrity" "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + "resolved" "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + "version" "1.0.1" + +"gensync@^1.0.0-beta.2": + "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "resolved" "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz" + "version" "1.0.0-beta.2" + +"get-caller-file@^2.0.1", "get-caller-file@^2.0.5": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1": + "integrity" "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==" + "resolved" "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-proto" "^1.0.1" + "has-symbols" "^1.0.3" + +"get-stream@^3.0.0": + "integrity" "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" + "resolved" "https://registry.npmmirror.com/get-stream/-/get-stream-3.0.0.tgz" + "version" "3.0.0" + +"get-stream@^4.0.0": + "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==" + "resolved" "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "pump" "^3.0.0" + +"get-stream@^6.0.0": + "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "resolved" "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz" + "version" "6.0.1" + +"glob-parent@^5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.1": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"glob-parent@~5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-to-regexp@^0.4.1": + "integrity" "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "resolved" "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + "version" "0.4.1" + +"glob@^7.1.3", "glob@^7.2.0": + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" + "resolved" "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" + "version" "7.2.3" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.1.1" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"globals@^11.1.0": + "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "resolved" "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz" + "version" "11.12.0" + +"globals@^13.6.0": + "integrity" "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==" + "resolved" "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz" + "version" "13.20.0" + dependencies: + "type-fest" "^0.20.2" + +"globals@^13.9.0": + "integrity" "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==" + "resolved" "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz" + "version" "13.20.0" + dependencies: + "type-fest" "^0.20.2" + +"globby@^11.0.2", "globby@^11.0.3": + "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + "resolved" "https://registry.npmmirror.com/globby/-/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" + +"good-listener@^1.2.2": + "integrity" "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/good-listener/-/good-listener-1.2.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fgood-listener%2F-%2Fgood-listener-1.2.2.tgz" + "version" "1.2.2" + dependencies: + "delegate" "^3.1.2" + +"graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.4", "graceful-fs@^4.2.6", "graceful-fs@^4.2.9": + "integrity" "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "resolved" "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz" + "version" "4.2.11" + +"gzip-size@^6.0.0": + "integrity" "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==" + "resolved" "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "duplexer" "^0.1.2" + +"handle-thing@^2.0.0": + "integrity" "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "resolved" "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz" + "version" "2.0.1" + +"has-flag@^3.0.0": + "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "resolved" "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"has-property-descriptors@^1.0.0": + "integrity" "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==" + "resolved" "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "get-intrinsic" "^1.1.1" + +"has-proto@^1.0.1": + "integrity" "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "resolved" "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz" + "version" "1.0.1" + +"has-symbols@^1.0.3": + "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "resolved" "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz" + "version" "1.0.3" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmmirror.com/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"hash-sum@^1.0.2": + "integrity" "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==" + "resolved" "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz" + "version" "1.0.2" + +"hash-sum@^2.0.0": + "integrity" "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" + "resolved" "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz" + "version" "2.0.0" + +"he@^1.2.0": + "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "resolved" "https://registry.npmmirror.com/he/-/he-1.2.0.tgz" + "version" "1.2.0" + +"highlight.js@^10.7.1": + "integrity" "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + "resolved" "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz" + "version" "10.7.3" + +"hosted-git-info@^2.1.4": + "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "resolved" "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + "version" "2.8.9" + +"hpack.js@^2.1.6": + "integrity" "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==" + "resolved" "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz" + "version" "2.1.6" + dependencies: + "inherits" "^2.0.1" + "obuf" "^1.0.0" + "readable-stream" "^2.0.1" + "wbuf" "^1.1.0" + +"html-entities@^2.3.2": + "integrity" "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==" + "resolved" "https://registry.npmmirror.com/html-entities/-/html-entities-2.4.0.tgz" + "version" "2.4.0" + +"html-minifier-terser@^6.0.2": + "integrity" "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==" + "resolved" "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "camel-case" "^4.1.2" + "clean-css" "^5.2.2" + "commander" "^8.3.0" + "he" "^1.2.0" + "param-case" "^3.0.4" + "relateurl" "^0.2.7" + "terser" "^5.10.0" + +"html-tags@^2.0.0": + "integrity" "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==" + "resolved" "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz" + "version" "2.0.0" + +"html-tags@^3.3.1": + "integrity" "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" + "resolved" "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz" + "version" "3.3.1" + +"html-void-elements@^2.0.0": + "integrity" "sha1-KUWbiwXCALbF7ph0PEG5edV3VJ8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/html-void-elements/-/html-void-elements-2.0.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fhtml-void-elements%2F-%2Fhtml-void-elements-2.0.1.tgz" + "version" "2.0.1" + +"html-webpack-plugin@^5.1.0": + "integrity" "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==" + "resolved" "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz" + "version" "5.5.3" + dependencies: + "@types/html-minifier-terser" "^6.0.0" + "html-minifier-terser" "^6.0.2" + "lodash" "^4.17.21" + "pretty-error" "^4.0.0" + "tapable" "^2.0.0" + +"htmlparser2@^6.1.0": + "integrity" "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==" + "resolved" "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "domelementtype" "^2.0.1" + "domhandler" "^4.0.0" + "domutils" "^2.5.2" + "entities" "^2.0.0" + +"http-deceiver@^1.2.7": + "integrity" "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "resolved" "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz" + "version" "1.2.7" + +"http-errors@~1.6.2": + "integrity" "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==" + "resolved" "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz" + "version" "1.6.3" + dependencies: + "depd" "~1.1.2" + "inherits" "2.0.3" + "setprototypeof" "1.1.0" + "statuses" ">= 1.4.0 < 2" + +"http-errors@2.0.0": + "integrity" "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" + "resolved" "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "depd" "2.0.0" + "inherits" "2.0.4" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "toidentifier" "1.0.1" + +"http-parser-js@>=0.5.1": + "integrity" "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "resolved" "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz" + "version" "0.5.8" + +"http-proxy-middleware@^2.0.3": + "integrity" "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==" + "resolved" "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + "version" "2.0.6" + dependencies: + "@types/http-proxy" "^1.17.8" + "http-proxy" "^1.18.1" + "is-glob" "^4.0.1" + "is-plain-obj" "^3.0.0" + "micromatch" "^4.0.2" + +"http-proxy@^1.18.1": + "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==" + "resolved" "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz" + "version" "1.18.1" + dependencies: + "eventemitter3" "^4.0.0" + "follow-redirects" "^1.0.0" + "requires-port" "^1.0.0" + +"human-signals@^2.1.0": + "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "resolved" "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz" + "version" "2.1.0" + +"i18next@^20.4.0": + "integrity" "sha1-U15fbluutoXH0l33DbY788wKo0U=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/i18next/-/i18next-20.6.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fi18next%2F-%2Fi18next-20.6.1.tgz" + "version" "20.6.1" + dependencies: + "@babel/runtime" "^7.12.0" + +"iconv-lite@0.4.24": + "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" + "resolved" "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz" + "version" "0.4.24" + dependencies: + "safer-buffer" ">= 2.1.2 < 3" + +"icss-utils@^5.0.0", "icss-utils@^5.1.0": + "integrity" "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "resolved" "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz" + "version" "5.1.0" + +"ieee754@^1.1.13": + "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "resolved" "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz" + "version" "1.2.1" + +"ignore@^4.0.6": + "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "resolved" "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz" + "version" "4.0.6" + +"ignore@^5.2.0": + "integrity" "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + "resolved" "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz" + "version" "5.2.4" + +"immer@^9.0.6": + "integrity" "sha1-HgJeoxpA8k+wZPH+8j6TFJYzAXY=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/immer/-/immer-9.0.21.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fimmer%2F-%2Fimmer-9.0.21.tgz" + "version" "9.0.21" + +"immutable@^4.0.0": + "integrity" "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + "resolved" "https://registry.npmmirror.com/immutable/-/immutable-4.3.1.tgz" + "version" "4.3.1" + +"import-fresh@^3.0.0", "import-fresh@^3.2.1": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmmirror.com/import-fresh/-/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" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "resolved" "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + +"inflight@^1.0.4": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmmirror.com/inflight/-/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.4", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"inherits@2.0.3": + "integrity" "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "resolved" "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz" + "version" "2.0.3" + +"ipaddr.js@^2.0.1": + "integrity" "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==" + "resolved" "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + "version" "2.1.0" + +"ipaddr.js@1.9.1": + "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "resolved" "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + "version" "1.9.1" + +"is-arrayish@^0.2.1": + "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "resolved" "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-ci@^1.0.10": + "integrity" "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==" + "resolved" "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "ci-info" "^1.5.0" + +"is-core-module@^2.11.0": + "integrity" "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==" + "resolved" "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.12.1.tgz" + "version" "2.12.1" + dependencies: + "has" "^1.0.3" + +"is-docker@^2.0.0", "is-docker@^2.1.1": + "integrity" "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "resolved" "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz" + "version" "2.2.1" + +"is-extglob@^2.1.1": + "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-file-esm@^1.0.0": + "integrity" "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==" + "resolved" "https://registry.npmmirror.com/is-file-esm/-/is-file-esm-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "read-pkg-up" "^7.0.1" + +"is-fullwidth-code-point@^2.0.0": + "integrity" "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + "resolved" "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + "version" "2.0.0" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-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" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-hotkey@^0.2.0": + "integrity" "sha1-GDWmgXGpHlyUYIadljNpR8g0DO8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/is-hotkey/-/is-hotkey-0.2.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fis-hotkey%2F-%2Fis-hotkey-0.2.0.tgz" + "version" "0.2.0" + +"is-interactive@^1.0.0": + "integrity" "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + "resolved" "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz" + "version" "1.0.0" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"is-plain-obj@^3.0.0": + "integrity" "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + "resolved" "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + "version" "3.0.0" + +"is-plain-object@^2.0.4": + "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==" + "resolved" "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "isobject" "^3.0.1" + +"is-plain-object@^5.0.0": + "integrity" "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/is-plain-object/-/is-plain-object-5.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fis-plain-object%2F-%2Fis-plain-object-5.0.0.tgz" + "version" "5.0.0" + +"is-stream@^1.1.0": + "integrity" "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + "resolved" "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz" + "version" "1.1.0" + +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"is-unicode-supported@^0.1.0": + "integrity" "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + "resolved" "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + "version" "0.1.0" + +"is-url@^1.2.4": + "integrity" "sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/is-url/-/is-url-1.2.4.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fis-url%2F-%2Fis-url-1.2.4.tgz" + "version" "1.2.4" + +"is-wsl@^2.1.1", "is-wsl@^2.2.0": + "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" + "resolved" "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "is-docker" "^2.0.0" + +"isarray@~1.0.0": + "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "resolved" "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"isexe@^2.0.0": + "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"isobject@^3.0.1": + "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + "resolved" "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz" + "version" "3.0.1" + +"javascript-stringify@^2.0.1": + "integrity" "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" + "resolved" "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz" + "version" "2.1.0" + +"jest-worker@^27.0.2", "jest-worker@^27.4.5": + "integrity" "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==" + "resolved" "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz" + "version" "27.5.1" + dependencies: + "@types/node" "*" + "merge-stream" "^2.0.0" + "supports-color" "^8.0.0" + +"jest-worker@^28.0.2": + "integrity" "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==" + "resolved" "https://registry.npmmirror.com/jest-worker/-/jest-worker-28.1.3.tgz" + "version" "28.1.3" + dependencies: + "@types/node" "*" + "merge-stream" "^2.0.0" + "supports-color" "^8.0.0" + +"joi@^17.4.0": + "integrity" "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==" + "resolved" "https://registry.npmmirror.com/joi/-/joi-17.9.2.tgz" + "version" "17.9.2" + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-message@1.0.7": + "integrity" "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==" + "resolved" "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz" + "version" "1.0.7" + +"js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmmirror.com/js-tokens/-/js-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/-/js-yaml-3.14.1.tgz" + "version" "3.14.1" + dependencies: + "argparse" "^1.0.7" + "esprima" "^4.0.0" + +"jsesc@^2.5.1": + "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "resolved" "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz" + "version" "2.5.2" + +"jsesc@~0.5.0": + "integrity" "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + "resolved" "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz" + "version" "0.5.0" + +"json-parse-better-errors@^1.0.2": + "integrity" "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "resolved" "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + "version" "1.0.2" + +"json-parse-even-better-errors@^2.3.0", "json-parse-even-better-errors@^2.3.1": + "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "resolved" "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + "version" "2.3.1" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-schema-traverse@^1.0.0": + "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "resolved" "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + "version" "1.0.0" + +"json-stable-stringify-without-jsonify@^1.0.1": + "integrity" "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "resolved" "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + "version" "1.0.1" + +"json5@^1.0.1": + "integrity" "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==" + "resolved" "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "minimist" "^1.2.0" + +"json5@^2.1.2", "json5@^2.2.2": + "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + "resolved" "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz" + "version" "2.2.3" + +"jsonfile@^6.0.1": + "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==" + "resolved" "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "universalify" "^2.0.0" + optionalDependencies: + "graceful-fs" "^4.1.6" + +"kind-of@^6.0.2": + "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "resolved" "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz" + "version" "6.0.3" + +"klona@^2.0.4", "klona@^2.0.5": + "integrity" "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + "resolved" "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz" + "version" "2.0.6" + +"launch-editor-middleware@^2.2.1": + "integrity" "sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==" + "resolved" "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "launch-editor" "^2.6.0" + +"launch-editor@^2.2.1", "launch-editor@^2.6.0": + "integrity" "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==" + "resolved" "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "picocolors" "^1.0.0" + "shell-quote" "^1.7.3" + +"less-loader@^11.1.3": + "integrity" "sha1-G7YtbKm/AKF3wCeTtUuqxA+b5pQ=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/less-loader/-/less-loader-11.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fless-loader%2F-%2Fless-loader-11.1.3.tgz" + "version" "11.1.3" + +"levn@^0.4.1": + "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + "resolved" "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz" + "version" "0.4.1" + dependencies: + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" + +"lilconfig@^2.0.3": + "integrity" "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + "resolved" "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz" + "version" "2.1.0" + +"lines-and-columns@^1.1.6": + "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "resolved" "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + "version" "1.2.4" + +"loader-runner@^4.1.0", "loader-runner@^4.2.0": + "integrity" "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + "resolved" "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" + "version" "4.3.0" + +"loader-utils@^1.0.2", "loader-utils@^1.1.0": + "integrity" "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==" + "resolved" "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz" + "version" "1.4.2" + dependencies: + "big.js" "^5.2.2" + "emojis-list" "^3.0.0" + "json5" "^1.0.1" + +"loader-utils@^2.0.0": + "integrity" "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==" + "resolved" "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "big.js" "^5.2.2" + "emojis-list" "^3.0.0" + "json5" "^2.1.2" + +"locate-path@^5.0.0": + "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + "resolved" "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-locate" "^4.1.0" + +"lodash.camelcase@^4.3.0": + "integrity" "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash.camelcase%2F-%2Flodash.camelcase-4.3.0.tgz" + "version" "4.3.0" + +"lodash.clonedeep@^4.5.0": + "integrity" "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash.clonedeep%2F-%2Flodash.clonedeep-4.5.0.tgz" + "version" "4.5.0" + +"lodash.debounce@^4.0.8": + "integrity" "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "resolved" "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + "version" "4.0.8" + +"lodash.defaultsdeep@^4.6.1": + "integrity" "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==" + "resolved" "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz" + "version" "4.6.1" + +"lodash.foreach@^4.5.0": + "integrity" "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/lodash.foreach/-/lodash.foreach-4.5.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash.foreach%2F-%2Flodash.foreach-4.5.0.tgz" + "version" "4.5.0" + +"lodash.isequal@^4.5.0": + "integrity" "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/lodash.isequal/-/lodash.isequal-4.5.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash.isequal%2F-%2Flodash.isequal-4.5.0.tgz" + "version" "4.5.0" + +"lodash.kebabcase@^4.1.1": + "integrity" "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" + "resolved" "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" + "version" "4.1.1" + +"lodash.mapvalues@^4.6.0": + "integrity" "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==" + "resolved" "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz" + "version" "4.6.0" + +"lodash.memoize@^4.1.2": + "integrity" "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + "resolved" "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + "version" "4.1.2" + +"lodash.merge@^4.6.2": + "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "resolved" "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz" + "version" "4.6.2" + +"lodash.throttle@^4.1.1": + "integrity" "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/lodash.throttle/-/lodash.throttle-4.1.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash.throttle%2F-%2Flodash.throttle-4.1.1.tgz" + "version" "4.1.1" + +"lodash.toarray@^4.4.0": + "integrity" "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/lodash.toarray/-/lodash.toarray-4.4.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash.toarray%2F-%2Flodash.toarray-4.4.0.tgz" + "version" "4.4.0" + +"lodash.truncate@^4.4.2": + "integrity" "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + "resolved" "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + "version" "4.4.2" + +"lodash.uniq@^4.5.0": + "integrity" "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "resolved" "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + "version" "4.5.0" + +"lodash@^4.17.14", "lodash@^4.17.20", "lodash@^4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"log-symbols@^4.1.0": + "integrity" "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" + "resolved" "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "chalk" "^4.1.0" + "is-unicode-supported" "^0.1.0" + +"log-update@^2.3.0": + "integrity" "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==" + "resolved" "https://registry.npmmirror.com/log-update/-/log-update-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "ansi-escapes" "^3.0.0" + "cli-cursor" "^2.0.0" + "wrap-ansi" "^3.0.1" + +"lower-case@^2.0.2": + "integrity" "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==" + "resolved" "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "tslib" "^2.0.3" + +"lru-cache@^4.0.1": + "integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==" + "resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz" + "version" "4.1.5" + dependencies: + "pseudomap" "^1.0.2" + "yallist" "^2.1.2" + +"lru-cache@^4.1.2": + "integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==" + "resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz" + "version" "4.1.5" + dependencies: + "pseudomap" "^1.0.2" + "yallist" "^2.1.2" + +"lru-cache@^5.1.1": + "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" + "resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "yallist" "^3.0.2" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"make-dir@^3.0.2", "make-dir@^3.1.0", "make-dir@~3.1.0": + "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + "resolved" "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "semver" "^6.0.0" + +"mdn-data@2.0.14": + "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "resolved" "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz" + "version" "2.0.14" + +"media-typer@0.3.0": + "integrity" "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "resolved" "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz" + "version" "0.3.0" + +"memfs@^3.4.3": + "integrity" "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==" + "resolved" "https://registry.npmmirror.com/memfs/-/memfs-3.5.3.tgz" + "version" "3.5.3" + dependencies: + "fs-monkey" "^1.0.4" + +"merge-descriptors@1.0.1": + "integrity" "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "resolved" "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + "version" "1.0.1" + +"merge-source-map@^1.1.0": + "integrity" "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==" + "resolved" "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "source-map" "^0.6.1" + +"merge-stream@^2.0.0": + "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved" "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" + "version" "2.0.0" + +"merge2@^1.3.0", "merge2@^1.4.1": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"methods@~1.1.2": + "integrity" "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "resolved" "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz" + "version" "1.1.2" + +"micromatch@^4.0.2", "micromatch@^4.0.4", "micromatch@^4.0.5": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" + dependencies: + "braces" "^3.0.2" + "picomatch" "^2.3.1" + +"mime-db@>= 1.43.0 < 2", "mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-match@^1.0.2": + "integrity" "sha1-P4fDHprxpf1IX7nbE0Qosju7e6g=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/mime-match/-/mime-match-1.0.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-match%2F-%2Fmime-match-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "wildcard" "^1.1.0" + +"mime-types@^2.1.12", "mime-types@^2.1.27", "mime-types@^2.1.31", "mime-types@~2.1.17", "mime-types@~2.1.24", "mime-types@~2.1.34": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime@~2.5.2": + "integrity" "sha1-bj3GzCuVEGQ4MOXxnVy3U9pe6r4=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/mime/-/mime-2.5.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fmime%2F-%2Fmime-2.5.2.tgz" + "version" "2.5.2" + +"mime@1.6.0": + "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "resolved" "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz" + "version" "1.6.0" + +"mimic-fn@^1.0.0": + "integrity" "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "resolved" "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz" + "version" "1.2.0" + +"mimic-fn@^2.1.0": + "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "resolved" "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz" + "version" "2.1.0" + +"mini-css-extract-plugin@^2.5.3": + "integrity" "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==" + "resolved" "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" + "version" "2.7.6" + dependencies: + "schema-utils" "^4.0.0" + +"minimalistic-assert@^1.0.0": + "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "resolved" "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + "version" "1.0.1" + +"minimatch@^3.0.4", "minimatch@^3.1.1": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimatch@~3.0.4": + "integrity" "sha1-XmpZvRHiqw3hz7hD6y2C5UbDIcE=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/minimatch/-/minimatch-3.0.8.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fminimatch%2F-%2Fminimatch-3.0.8.tgz" + "version" "3.0.8" + dependencies: + "brace-expansion" "^1.1.7" + +"minimist@^1.2.0", "minimist@^1.2.5", "minimist@^1.2.6": + "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "resolved" "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz" + "version" "1.2.8" + +"minipass@^3.1.1": + "integrity" "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==" + "resolved" "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz" + "version" "3.3.6" + dependencies: + "yallist" "^4.0.0" + +"mkdirp@^0.5.6": + "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" + "resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz" + "version" "0.5.6" + dependencies: + "minimist" "^1.2.6" + +"module-alias@^2.2.2": + "integrity" "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==" + "resolved" "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz" + "version" "2.2.3" + +"moment@^2.29.4": + "integrity" "sha1-Pb4FKIn+fBsu2Wb8s6dzKJZO8Qg=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/moment/-/moment-2.29.4.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fmoment%2F-%2Fmoment-2.29.4.tgz" + "version" "2.29.4" + +"mrmime@^1.0.0": + "integrity" "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" + "resolved" "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz" + "version" "1.0.1" + +"ms@^2.1.1", "ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"ms@2.0.0": + "integrity" "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved" "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz" + "version" "2.0.0" + +"ms@2.1.3": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"multicast-dns@^7.2.5": + "integrity" "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==" + "resolved" "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz" + "version" "7.2.5" + dependencies: + "dns-packet" "^5.2.2" + "thunky" "^1.0.2" + +"mz@^2.4.0": + "integrity" "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==" + "resolved" "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz" + "version" "2.7.0" + dependencies: + "any-promise" "^1.0.0" + "object-assign" "^4.0.1" + "thenify-all" "^1.0.0" + +"namespace-emitter@^2.0.1": + "integrity" "sha1-l41RNhxhMTtOa4z284U9CN+isXw=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/namespace-emitter/-/namespace-emitter-2.0.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fnamespace-emitter%2F-%2Fnamespace-emitter-2.0.1.tgz" + "version" "2.0.1" + +"nanoid@^3.1.25", "nanoid@^3.2.0", "nanoid@^3.3.6": + "integrity" "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + "resolved" "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz" + "version" "3.3.6" + +"natural-compare@^1.4.0": + "integrity" "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "resolved" "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz" + "version" "1.4.0" + +"negotiator@0.6.3": + "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "resolved" "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz" + "version" "0.6.3" + +"neo-async@^2.6.2": + "integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "resolved" "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz" + "version" "2.6.2" + +"next-tick@^1.1.0": + "integrity" "sha1-GDbuMK1W1n7ygbIr0Zn3CUSbNes=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/next-tick/-/next-tick-1.1.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fnext-tick%2F-%2Fnext-tick-1.1.0.tgz" + "version" "1.1.0" + +"nice-try@^1.0.4": + "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "resolved" "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz" + "version" "1.0.5" + +"no-case@^3.0.4": + "integrity" "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==" + "resolved" "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "lower-case" "^2.0.2" + "tslib" "^2.0.3" + +"node-fetch@^2.6.7": + "integrity" "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==" + "resolved" "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.12.tgz" + "version" "2.6.12" + dependencies: + "whatwg-url" "^5.0.0" + +"node-forge@^1": + "integrity" "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + "resolved" "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz" + "version" "1.3.1" + +"node-releases@^2.0.12": + "integrity" "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "resolved" "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz" + "version" "2.0.13" + +"normalize-package-data@^2.5.0": + "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" + "resolved" "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + "version" "2.5.0" + dependencies: + "hosted-git-info" "^2.1.4" + "resolve" "^1.10.0" + "semver" "2 || 3 || 4 || 5" + "validate-npm-package-license" "^3.0.1" + +"normalize-path@^1.0.0": + "integrity" "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==" + "resolved" "https://registry.npmmirror.com/normalize-path/-/normalize-path-1.0.0.tgz" + "version" "1.0.0" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"normalize-range@^0.1.2": + "integrity" "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + "resolved" "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz" + "version" "0.1.2" + +"normalize-url@^6.0.1": + "integrity" "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + "resolved" "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz" + "version" "6.1.0" + +"normalize-wheel@^1.0.1": + "integrity" "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" + "resolved" "https://r2.cnpmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz" + "version" "1.0.1" + +"npm-run-path@^2.0.0": + "integrity" "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==" + "resolved" "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "path-key" "^2.0.0" + +"npm-run-path@^4.0.1": + "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + "resolved" "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "path-key" "^3.0.0" + +"nth-check@^2.0.1": + "integrity" "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" + "resolved" "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "boolbase" "^1.0.0" + +"object-assign@^4.0.1": + "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "resolved" "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"object-inspect@^1.9.0": + "integrity" "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "resolved" "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz" + "version" "1.12.3" + +"object-keys@^1.1.1": + "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "resolved" "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz" + "version" "1.1.1" + +"object.assign@^4.1.0": + "integrity" "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==" + "resolved" "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz" + "version" "4.1.4" + dependencies: + "call-bind" "^1.0.2" + "define-properties" "^1.1.4" + "has-symbols" "^1.0.3" + "object-keys" "^1.1.1" + +"obuf@^1.0.0", "obuf@^1.1.2": + "integrity" "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "resolved" "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz" + "version" "1.1.2" + +"on-finished@2.4.1": + "integrity" "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" + "resolved" "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "ee-first" "1.1.1" + +"on-headers@~1.0.2": + "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "resolved" "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz" + "version" "1.0.2" + +"once@^1.3.0", "once@^1.3.1", "once@^1.4.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmmirror.com/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"onetime@^2.0.0": + "integrity" "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==" + "resolved" "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "mimic-fn" "^1.0.0" + +"onetime@^5.1.0", "onetime@^5.1.2": + "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + "resolved" "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "mimic-fn" "^2.1.0" + +"open@^8.0.2", "open@^8.0.9": + "integrity" "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==" + "resolved" "https://registry.npmmirror.com/open/-/open-8.4.2.tgz" + "version" "8.4.2" + dependencies: + "define-lazy-prop" "^2.0.0" + "is-docker" "^2.1.1" + "is-wsl" "^2.2.0" + +"opener@^1.5.2": + "integrity" "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + "resolved" "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz" + "version" "1.5.2" + +"optionator@^0.9.1": + "integrity" "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==" + "resolved" "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz" + "version" "0.9.3" + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + "deep-is" "^0.1.3" + "fast-levenshtein" "^2.0.6" + "levn" "^0.4.1" + "prelude-ls" "^1.2.1" + "type-check" "^0.4.0" + +"ora@^5.3.0": + "integrity" "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==" + "resolved" "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz" + "version" "5.4.1" + dependencies: + "bl" "^4.1.0" + "chalk" "^4.1.0" + "cli-cursor" "^3.1.0" + "cli-spinners" "^2.5.0" + "is-interactive" "^1.0.0" + "is-unicode-supported" "^0.1.0" + "log-symbols" "^4.1.0" + "strip-ansi" "^6.0.0" + "wcwidth" "^1.0.1" + +"p-finally@^1.0.0": + "integrity" "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + "resolved" "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz" + "version" "1.0.0" + +"p-limit@^2.2.0": + "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + "resolved" "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "p-try" "^2.0.0" + +"p-locate@^4.1.0": + "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + "resolved" "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "p-limit" "^2.2.0" + +"p-retry@^4.5.0": + "integrity" "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==" + "resolved" "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz" + "version" "4.6.2" + dependencies: + "@types/retry" "0.12.0" + "retry" "^0.13.1" + +"p-try@^2.0.0": + "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "resolved" "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz" + "version" "2.2.0" + +"param-case@^3.0.4": + "integrity" "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==" + "resolved" "https://registry.npmmirror.com/param-case/-/param-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" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + +"parse-json@^5.0.0": + "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" + "resolved" "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "@babel/code-frame" "^7.0.0" + "error-ex" "^1.3.1" + "json-parse-even-better-errors" "^2.3.0" + "lines-and-columns" "^1.1.6" + +"parse5-htmlparser2-tree-adapter@^6.0.0": + "integrity" "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==" + "resolved" "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "parse5" "^6.0.1" + +"parse5@^5.1.1": + "integrity" "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "resolved" "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz" + "version" "5.1.1" + +"parse5@^6.0.1": + "integrity" "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "resolved" "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz" + "version" "6.0.1" + +"parseurl@~1.3.2", "parseurl@~1.3.3": + "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "resolved" "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz" + "version" "1.3.3" + +"pascal-case@^3.1.2": + "integrity" "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==" + "resolved" "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "no-case" "^3.0.4" + "tslib" "^2.0.3" + +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-key@^2.0.0", "path-key@^2.0.1": + "integrity" "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + "resolved" "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz" + "version" "2.0.1" + +"path-key@^3.0.0", "path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-parse@^1.0.7": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-to-regexp@0.1.7": + "integrity" "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "resolved" "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + "version" "0.1.7" + +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" + +"picocolors@^0.2.1": + "integrity" "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + "resolved" "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz" + "version" "0.2.1" + +"picocolors@^1.0.0": + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved" "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz" + "version" "1.0.0" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"pify@^2.3.0": + "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/pify/-/pify-2.3.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fpify%2F-%2Fpify-2.3.0.tgz" + "version" "2.3.0" + +"pkg-dir@^4.1.0": + "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" + "resolved" "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "find-up" "^4.0.0" + +"pngjs@^5.0.0": + "integrity" "sha1-553SshV2f9nARWHAEjbflgvOf7s=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/pngjs/-/pngjs-5.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fpngjs%2F-%2Fpngjs-5.0.0.tgz" + "version" "5.0.0" + +"portfinder@^1.0.26": + "integrity" "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==" + "resolved" "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz" + "version" "1.0.32" + dependencies: + "async" "^2.6.4" + "debug" "^3.2.7" + "mkdirp" "^0.5.6" + +"postcss-calc@^8.2.3": + "integrity" "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==" + "resolved" "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz" + "version" "8.2.4" + dependencies: + "postcss-selector-parser" "^6.0.9" + "postcss-value-parser" "^4.2.0" + +"postcss-colormin@^5.3.1": + "integrity" "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==" + "resolved" "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz" + "version" "5.3.1" + dependencies: + "browserslist" "^4.21.4" + "caniuse-api" "^3.0.0" + "colord" "^2.9.1" + "postcss-value-parser" "^4.2.0" + +"postcss-convert-values@^5.1.3": + "integrity" "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==" + "resolved" "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" + "version" "5.1.3" + dependencies: + "browserslist" "^4.21.4" + "postcss-value-parser" "^4.2.0" + +"postcss-discard-comments@^5.1.2": + "integrity" "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" + "resolved" "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" + "version" "5.1.2" + +"postcss-discard-duplicates@^5.1.0": + "integrity" "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + "resolved" "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + "version" "5.1.0" + +"postcss-discard-empty@^5.1.1": + "integrity" "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + "resolved" "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + "version" "5.1.1" + +"postcss-discard-overridden@^5.1.0": + "integrity" "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + "resolved" "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + "version" "5.1.0" + +"postcss-import@^15.1.0": + "integrity" "sha1-QcZO2MwOI3NalpizJJ/9v3BK3HA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/postcss-import/-/postcss-import-15.1.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-import%2F-%2Fpostcss-import-15.1.0.tgz" + "version" "15.1.0" + dependencies: + "postcss-value-parser" "^4.0.0" + "read-cache" "^1.0.0" + "resolve" "^1.1.7" + +"postcss-loader@^6.1.1": + "integrity" "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==" + "resolved" "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz" + "version" "6.2.1" + dependencies: + "cosmiconfig" "^7.0.0" + "klona" "^2.0.5" + "semver" "^7.3.5" + +"postcss-merge-longhand@^5.1.7": + "integrity" "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==" + "resolved" "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" + "version" "5.1.7" + dependencies: + "postcss-value-parser" "^4.2.0" + "stylehacks" "^5.1.1" + +"postcss-merge-rules@^5.1.4": + "integrity" "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==" + "resolved" "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" + "version" "5.1.4" + dependencies: + "browserslist" "^4.21.4" + "caniuse-api" "^3.0.0" + "cssnano-utils" "^3.1.0" + "postcss-selector-parser" "^6.0.5" + +"postcss-minify-font-values@^5.1.0": + "integrity" "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==" + "resolved" "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-minify-gradients@^5.1.1": + "integrity" "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==" + "resolved" "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "colord" "^2.9.1" + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" + +"postcss-minify-params@^5.1.4": + "integrity" "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==" + "resolved" "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" + "version" "5.1.4" + dependencies: + "browserslist" "^4.21.4" + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" + +"postcss-minify-selectors@^5.2.1": + "integrity" "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==" + "resolved" "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" + "version" "5.2.1" + dependencies: + "postcss-selector-parser" "^6.0.5" + +"postcss-modules-extract-imports@^3.0.0": + "integrity" "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "resolved" "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + "version" "3.0.0" + +"postcss-modules-local-by-default@^4.0.3": + "integrity" "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==" + "resolved" "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "icss-utils" "^5.0.0" + "postcss-selector-parser" "^6.0.2" + "postcss-value-parser" "^4.1.0" + +"postcss-modules-scope@^3.0.0": + "integrity" "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==" + "resolved" "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "postcss-selector-parser" "^6.0.4" + +"postcss-modules-values@^4.0.0": + "integrity" "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==" + "resolved" "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "icss-utils" "^5.0.0" + +"postcss-normalize-charset@^5.1.0": + "integrity" "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + "version" "5.1.0" + +"postcss-normalize-display-values@^5.1.0": + "integrity" "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-positions@^5.1.1": + "integrity" "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-repeat-style@^5.1.1": + "integrity" "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-string@^5.1.0": + "integrity" "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-timing-functions@^5.1.0": + "integrity" "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-unicode@^5.1.1": + "integrity" "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "browserslist" "^4.21.4" + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-url@^5.1.0": + "integrity" "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "normalize-url" "^6.0.1" + "postcss-value-parser" "^4.2.0" + +"postcss-normalize-whitespace@^5.1.1": + "integrity" "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==" + "resolved" "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-ordered-values@^5.1.3": + "integrity" "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==" + "resolved" "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" + "version" "5.1.3" + dependencies: + "cssnano-utils" "^3.1.0" + "postcss-value-parser" "^4.2.0" + +"postcss-reduce-initial@^5.1.2": + "integrity" "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==" + "resolved" "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "browserslist" "^4.21.4" + "caniuse-api" "^3.0.0" + +"postcss-reduce-transforms@^5.1.0": + "integrity" "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==" + "resolved" "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-value-parser" "^4.2.0" + +"postcss-selector-parser@^6.0.2", "postcss-selector-parser@^6.0.4", "postcss-selector-parser@^6.0.5", "postcss-selector-parser@^6.0.9": + "integrity" "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==" + "resolved" "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + "version" "6.0.13" + dependencies: + "cssesc" "^3.0.0" + "util-deprecate" "^1.0.2" + +"postcss-svgo@^5.1.0": + "integrity" "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==" + "resolved" "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "postcss-value-parser" "^4.2.0" + "svgo" "^2.7.0" + +"postcss-unique-selectors@^5.1.1": + "integrity" "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==" + "resolved" "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "postcss-selector-parser" "^6.0.5" + +"postcss-url@^10.1.3": + "integrity" "sha1-VBIMyRAwniR17AXCz6j4ot6v3x4=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/postcss-url/-/postcss-url-10.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss-url%2F-%2Fpostcss-url-10.1.3.tgz" + "version" "10.1.3" + dependencies: + "make-dir" "~3.1.0" + "mime" "~2.5.2" + "minimatch" "~3.0.4" + "xxhashjs" "~0.2.2" + +"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.1.0", "postcss-value-parser@^4.2.0": + "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "resolved" "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + "version" "4.2.0" + +"postcss@^7.0.0 || ^8.0.1", "postcss@^8.0.0", "postcss@^8.0.9", "postcss@^8.1.0", "postcss@^8.2.15", "postcss@^8.2.2", "postcss@^8.2.6", "postcss@^8.3.5", "postcss@^8.4.14", "postcss@^8.4.21": + "integrity" "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==" + "resolved" "https://registry.npmmirror.com/postcss/-/postcss-8.4.27.tgz" + "version" "8.4.27" + dependencies: + "nanoid" "^3.3.6" + "picocolors" "^1.0.0" + "source-map-js" "^1.0.2" + +"postcss@^7.0.36": + "integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==" + "resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz" + "version" "7.0.39" + dependencies: + "picocolors" "^0.2.1" + "source-map" "^0.6.1" + +"preact@^10.5.13": + "integrity" "sha1-aKBtcLGRuKMT6nItYeCcayp5o34=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/preact/-/preact-10.16.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fpreact%2F-%2Fpreact-10.16.0.tgz" + "version" "10.16.0" + +"prelude-ls@^1.2.1": + "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "resolved" "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz" + "version" "1.2.1" + +"prettier-linter-helpers@^1.0.0": + "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==" + "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "fast-diff" "^1.1.2" + +"prettier@^1.18.2 || ^2.0.0", "prettier@^2.4.1", "prettier@>=2.0.0": + "integrity" "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" + "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + "version" "2.8.8" + +"pretty-error@^4.0.0": + "integrity" "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==" + "resolved" "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "lodash" "^4.17.20" + "renderkid" "^3.0.0" + +"prismjs@^1.23.0": + "integrity" "sha1-8RNVWo+ptXw15je7onUJ3PgC3RI=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/prismjs/-/prismjs-1.29.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fprismjs%2F-%2Fprismjs-1.29.0.tgz" + "version" "1.29.0" + +"process-nextick-args@~2.0.0": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" + +"progress-webpack-plugin@^1.0.12": + "integrity" "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==" + "resolved" "https://registry.npmmirror.com/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz" + "version" "1.0.16" + dependencies: + "chalk" "^2.1.0" + "figures" "^2.0.0" + "log-update" "^2.3.0" + +"progress@^2.0.0": + "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "resolved" "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz" + "version" "2.0.3" + +"proxy-addr@~2.0.7": + "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" + "resolved" "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz" + "version" "2.0.7" + dependencies: + "forwarded" "0.2.0" + "ipaddr.js" "1.9.1" + +"proxy-from-env@^1.1.0": + "integrity" "sha1-4QLxbKNVQkhldV0sno6k8k1Yw+I=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fproxy-from-env%2F-%2Fproxy-from-env-1.1.0.tgz" + "version" "1.1.0" + +"pseudomap@^1.0.2": + "integrity" "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "resolved" "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz" + "version" "1.0.2" + +"pump@^3.0.0": + "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" + "resolved" "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "end-of-stream" "^1.1.0" + "once" "^1.3.1" + +"punycode@^2.1.0": + "integrity" "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "resolved" "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz" + "version" "2.3.0" + +"qrcode@^1.5.3": + "integrity" "sha1-A6+oCRLA3M8SvJP2FaU1qtEGYXA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/qrcode/-/qrcode-1.5.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fqrcode%2F-%2Fqrcode-1.5.3.tgz" + "version" "1.5.3" + dependencies: + "dijkstrajs" "^1.0.1" + "encode-utf8" "^1.0.3" + "pngjs" "^5.0.0" + "yargs" "^15.3.1" + +"qs@6.11.0": + "integrity" "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==" + "resolved" "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz" + "version" "6.11.0" + dependencies: + "side-channel" "^1.0.4" + +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" + +"randombytes@^2.1.0": + "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + "resolved" "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "safe-buffer" "^5.1.0" + +"range-parser@^1.2.1", "range-parser@~1.2.1": + "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "resolved" "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz" + "version" "1.2.1" + +"raw-body@2.5.1": + "integrity" "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==" + "resolved" "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz" + "version" "2.5.1" + dependencies: + "bytes" "3.1.2" + "http-errors" "2.0.0" + "iconv-lite" "0.4.24" + "unpipe" "1.0.0" + +"read-cache@^1.0.0": + "integrity" "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/read-cache/-/read-cache-1.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fread-cache%2F-%2Fread-cache-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "pify" "^2.3.0" + +"read-pkg-up@^7.0.1": + "integrity" "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==" + "resolved" "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "find-up" "^4.1.0" + "read-pkg" "^5.2.0" + "type-fest" "^0.8.1" + +"read-pkg@^5.1.1", "read-pkg@^5.2.0": + "integrity" "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==" + "resolved" "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "@types/normalize-package-data" "^2.4.0" + "normalize-package-data" "^2.5.0" + "parse-json" "^5.0.0" + "type-fest" "^0.6.0" + +"readable-stream@^2.0.1": + "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" + "resolved" "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz" + "version" "2.3.8" + 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.0.6", "readable-stream@^3.4.0": + "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" + "resolved" "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz" + "version" "3.6.2" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"readdirp@~3.6.0": + "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + "resolved" "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "picomatch" "^2.2.1" + +"regenerate-unicode-properties@^10.1.0": + "integrity" "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==" + "resolved" "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + "version" "10.1.0" + dependencies: + "regenerate" "^1.4.2" + +"regenerate@^1.4.2": + "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "resolved" "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz" + "version" "1.4.2" + +"regenerator-runtime@^0.11.0": + "integrity" "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "resolved" "https://r2.cnpmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" + "version" "0.11.1" + +"regenerator-runtime@^0.13.11": + "integrity" "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "resolved" "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + "version" "0.13.11" + +"regenerator-transform@^0.15.1": + "integrity" "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==" + "resolved" "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + "version" "0.15.1" + dependencies: + "@babel/runtime" "^7.8.4" + +"regexpp@^3.1.0": + "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + "resolved" "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz" + "version" "3.2.0" + +"regexpu-core@^5.3.1": + "integrity" "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==" + "resolved" "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz" + "version" "5.3.2" + dependencies: + "@babel/regjsgen" "^0.8.0" + "regenerate" "^1.4.2" + "regenerate-unicode-properties" "^10.1.0" + "regjsparser" "^0.9.1" + "unicode-match-property-ecmascript" "^2.0.0" + "unicode-match-property-value-ecmascript" "^2.1.0" + +"regjsparser@^0.9.1": + "integrity" "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==" + "resolved" "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz" + "version" "0.9.1" + dependencies: + "jsesc" "~0.5.0" + +"relateurl@^0.2.7": + "integrity" "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + "resolved" "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz" + "version" "0.2.7" + +"renderkid@^3.0.0": + "integrity" "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==" + "resolved" "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "css-select" "^4.1.3" + "dom-converter" "^0.2.0" + "htmlparser2" "^6.1.0" + "lodash" "^4.17.21" + "strip-ansi" "^6.0.1" + +"require-directory@^2.1.1": + "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "resolved" "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" + +"require-from-string@^2.0.2": + "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "resolved" "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz" + "version" "2.0.2" + +"require-main-filename@^2.0.0": + "integrity" "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Frequire-main-filename%2F-%2Frequire-main-filename-2.0.0.tgz" + "version" "2.0.0" + +"requires-port@^1.0.0": + "integrity" "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "resolved" "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz" + "version" "1.0.0" + +"resize-observer-polyfill@^1.5.0": + "integrity" "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + "resolved" "https://r2.cnpmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" + "version" "1.5.1" + +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"resolve@^1.1.7", "resolve@^1.10.0", "resolve@^1.14.2": + "integrity" "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==" + "resolved" "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz" + "version" "1.22.2" + dependencies: + "is-core-module" "^2.11.0" + "path-parse" "^1.0.7" + "supports-preserve-symlinks-flag" "^1.0.0" + +"restore-cursor@^2.0.0": + "integrity" "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==" + "resolved" "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "onetime" "^2.0.0" + "signal-exit" "^3.0.2" + +"restore-cursor@^3.1.0": + "integrity" "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" + "resolved" "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "onetime" "^5.1.0" + "signal-exit" "^3.0.2" + +"retry@^0.13.1": + "integrity" "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + "resolved" "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz" + "version" "0.13.1" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"safe-buffer@^5.1.0", "safe-buffer@>=5.1.0", "safe-buffer@~5.2.0", "safe-buffer@5.2.1": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safe-buffer@5.1.2": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safer-buffer@>= 2.1.2 < 3": + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"sass-loader@^12.0.0": + "integrity" "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==" + "resolved" "https://registry.npmmirror.com/sass-loader/-/sass-loader-12.6.0.tgz" + "version" "12.6.0" + dependencies: + "klona" "^2.0.4" + "neo-async" "^2.6.2" + +"sass@^1.3.0", "sass@^1.32.7": + "integrity" "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==" + "resolved" "https://registry.npmmirror.com/sass/-/sass-1.64.1.tgz" + "version" "1.64.1" + dependencies: + "chokidar" ">=3.0.0 <4.0.0" + "immutable" "^4.0.0" + "source-map-js" ">=0.6.2 <2.0.0" + +"schema-utils@^2.6.5", "schema-utils@^2.7.0": + "integrity" "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "@types/json-schema" "^7.0.5" + "ajv" "^6.12.4" + "ajv-keywords" "^3.5.2" + +"schema-utils@^3.0.0": + "integrity" "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "@types/json-schema" "^7.0.8" + "ajv" "^6.12.5" + "ajv-keywords" "^3.5.2" + +"schema-utils@^3.1.1": + "integrity" "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "@types/json-schema" "^7.0.8" + "ajv" "^6.12.5" + "ajv-keywords" "^3.5.2" + +"schema-utils@^3.2.0": + "integrity" "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "@types/json-schema" "^7.0.8" + "ajv" "^6.12.5" + "ajv-keywords" "^3.5.2" + +"schema-utils@^4.0.0": + "integrity" "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==" + "resolved" "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "@types/json-schema" "^7.0.9" + "ajv" "^8.9.0" + "ajv-formats" "^2.1.1" + "ajv-keywords" "^5.1.0" + +"scroll-into-view-if-needed@^2.2.28": + "integrity" "sha1-08SClZ3Eg+N5YtFSElTjKV0NFYc=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fscroll-into-view-if-needed%2F-%2Fscroll-into-view-if-needed-2.2.31.tgz" + "version" "2.2.31" + dependencies: + "compute-scroll-into-view" "^1.0.20" + +"select-hose@^2.0.0": + "integrity" "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "resolved" "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz" + "version" "2.0.0" + +"select@^1.1.2": + "integrity" "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/select/-/select-1.1.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fselect%2F-%2Fselect-1.1.2.tgz" + "version" "1.1.2" + +"selfsigned@^2.1.1": + "integrity" "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==" + "resolved" "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "node-forge" "^1" + +"semver@^5.5.0": + "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz" + "version" "5.7.2" + +"semver@^6.0.0", "semver@^6.3.1": + "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" + "version" "6.3.1" + +"semver@^7.2.1": + "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz" + "version" "7.5.4" + dependencies: + "lru-cache" "^6.0.0" + +"semver@^7.3.4": + "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz" + "version" "7.5.4" + dependencies: + "lru-cache" "^6.0.0" + +"semver@^7.3.5": + "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz" + "version" "7.5.4" + dependencies: + "lru-cache" "^6.0.0" + +"semver@^7.3.8": + "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz" + "version" "7.5.4" + dependencies: + "lru-cache" "^6.0.0" + +"semver@2 || 3 || 4 || 5": + "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "resolved" "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz" + "version" "5.7.2" + +"send@0.18.0": + "integrity" "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==" + "resolved" "https://registry.npmmirror.com/send/-/send-0.18.0.tgz" + "version" "0.18.0" + dependencies: + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "etag" "~1.8.1" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "mime" "1.6.0" + "ms" "2.1.3" + "on-finished" "2.4.1" + "range-parser" "~1.2.1" + "statuses" "2.0.1" + +"serialize-javascript@^6.0.0", "serialize-javascript@^6.0.1": + "integrity" "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==" + "resolved" "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "randombytes" "^2.1.0" + +"serve-index@^1.9.1": + "integrity" "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==" + "resolved" "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "accepts" "~1.3.4" + "batch" "0.6.1" + "debug" "2.6.9" + "escape-html" "~1.0.3" + "http-errors" "~1.6.2" + "mime-types" "~2.1.17" + "parseurl" "~1.3.2" + +"serve-static@1.15.0": + "integrity" "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==" + "resolved" "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "parseurl" "~1.3.3" + "send" "0.18.0" + +"set-blocking@^2.0.0": + "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fset-blocking%2F-%2Fset-blocking-2.0.0.tgz" + "version" "2.0.0" + +"setprototypeof@1.1.0": + "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "resolved" "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz" + "version" "1.1.0" + +"setprototypeof@1.2.0": + "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "resolved" "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz" + "version" "1.2.0" + +"shallow-clone@^3.0.0": + "integrity" "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==" + "resolved" "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "kind-of" "^6.0.2" + +"shebang-command@^1.2.0": + "integrity" "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==" + "resolved" "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "shebang-regex" "^1.0.0" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^1.0.0": + "integrity" "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + "resolved" "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz" + "version" "1.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"shell-quote@^1.7.3": + "integrity" "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + "resolved" "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz" + "version" "1.8.1" + +"side-channel@^1.0.4": + "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + "resolved" "https://registry.npmmirror.com/side-channel/-/side-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" + +"signal-exit@^3.0.0", "signal-exit@^3.0.2", "signal-exit@^3.0.3": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"sirv@^1.0.7": + "integrity" "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==" + "resolved" "https://registry.npmmirror.com/sirv/-/sirv-1.0.19.tgz" + "version" "1.0.19" + dependencies: + "@polka/url" "^1.0.0-next.20" + "mrmime" "^1.0.0" + "totalist" "^1.0.0" + +"slash@^3.0.0": + "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "resolved" "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz" + "version" "3.0.0" + +"slate-history@^0.66.0": + "integrity" "sha1-rGP925AwmM60yURDPj91/mOs+UA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/slate-history/-/slate-history-0.66.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fslate-history%2F-%2Fslate-history-0.66.0.tgz" + "version" "0.66.0" + dependencies: + "is-plain-object" "^5.0.0" + +"slate@^0.72.0", "slate@>=0.65.3": + "integrity" "sha1-WgGO3yTkVEhlUpOmi/vPVjqluoE=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/slate/-/slate-0.72.8.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fslate%2F-%2Fslate-0.72.8.tgz" + "version" "0.72.8" + dependencies: + "immer" "^9.0.6" + "is-plain-object" "^5.0.0" + "tiny-warning" "^1.0.3" + +"slice-ansi@^4.0.0": + "integrity" "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" + "resolved" "https://registry.npmmirror.com/slice-ansi/-/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" + +"snabbdom@^3.1.0": + "integrity" "sha1-JfgO8VsZS66nA9nVRBiS42neGOE=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/snabbdom/-/snabbdom-3.5.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fsnabbdom%2F-%2Fsnabbdom-3.5.1.tgz" + "version" "3.5.1" + +"sockjs@^0.3.24": + "integrity" "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==" + "resolved" "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz" + "version" "0.3.24" + dependencies: + "faye-websocket" "^0.11.3" + "uuid" "^8.3.2" + "websocket-driver" "^0.7.4" + +"sortablejs@1.10.2": + "integrity" "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==" + "resolved" "https://r2.cnpmjs.org/sortablejs/-/sortablejs-1.10.2.tgz" + "version" "1.10.2" + +"source-map-js@^1.0.2", "source-map-js@>=0.6.2 <2.0.0": + "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "resolved" "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz" + "version" "1.0.2" + +"source-map-support@~0.5.20": + "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + "resolved" "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + "version" "0.5.21" + dependencies: + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" + +"source-map@^0.6.0", "source-map@^0.6.1", "source-map@~0.6.0", "source-map@~0.6.1": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" + +"spdx-correct@^3.0.0": + "integrity" "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==" + "resolved" "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "spdx-expression-parse" "^3.0.0" + "spdx-license-ids" "^3.0.0" + +"spdx-exceptions@^2.1.0": + "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "resolved" "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + "version" "2.3.0" + +"spdx-expression-parse@^3.0.0": + "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" + "resolved" "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "spdx-exceptions" "^2.1.0" + "spdx-license-ids" "^3.0.0" + +"spdx-license-ids@^3.0.0": + "integrity" "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "resolved" "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" + "version" "3.0.13" + +"spdy-transport@^3.0.0": + "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==" + "resolved" "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "debug" "^4.1.0" + "detect-node" "^2.0.4" + "hpack.js" "^2.1.6" + "obuf" "^1.1.2" + "readable-stream" "^3.0.6" + "wbuf" "^1.7.3" + +"spdy@^4.0.2": + "integrity" "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==" + "resolved" "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz" + "version" "4.0.2" + dependencies: + "debug" "^4.1.0" + "handle-thing" "^2.0.0" + "http-deceiver" "^1.2.7" + "select-hose" "^2.0.0" + "spdy-transport" "^3.0.0" + +"sprintf-js@~1.0.2": + "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "resolved" "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" + +"ssr-window@^3.0.0-alpha.1": + "integrity" "sha1-/VuCgBY4lD4MxwTEaRgBQ1r3rDc=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/ssr-window/-/ssr-window-3.0.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fssr-window%2F-%2Fssr-window-3.0.0.tgz" + "version" "3.0.0" + +"ssri@^8.0.1": + "integrity" "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==" + "resolved" "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz" + "version" "8.0.1" + dependencies: + "minipass" "^3.1.1" + +"stable@^0.1.8": + "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "resolved" "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz" + "version" "0.1.8" + +"stackframe@^1.3.4": + "integrity" "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + "resolved" "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz" + "version" "1.3.4" + +"statuses@>= 1.4.0 < 2": + "integrity" "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "resolved" "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz" + "version" "1.5.0" + +"statuses@2.0.1": + "integrity" "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "resolved" "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz" + "version" "2.0.1" + +"string_decoder@^1.1.1": + "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + "resolved" "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "safe-buffer" "~5.2.0" + +"string_decoder@~1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "safe-buffer" "~5.1.0" + +"string-width@^2.1.1": + "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" + "resolved" "https://registry.npmmirror.com/string-width/-/string-width-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "is-fullwidth-code-point" "^2.0.0" + "strip-ansi" "^4.0.0" + +"string-width@^4.1.0", "string-width@^4.2.0", "string-width@^4.2.3": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmmirror.com/string-width/-/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" + +"strip-ansi@^4.0.0": + "integrity" "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" + "resolved" "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "ansi-regex" "^3.0.0" + +"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"strip-eof@^1.0.0": + "integrity" "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" + "resolved" "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz" + "version" "1.0.0" + +"strip-final-newline@^2.0.0": + "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "resolved" "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + "version" "2.0.0" + +"strip-indent@^2.0.0": + "integrity" "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==" + "resolved" "https://registry.npmmirror.com/strip-indent/-/strip-indent-2.0.0.tgz" + "version" "2.0.0" + +"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" + +"style-resources-loader@^1.5.0": + "integrity" "sha1-bgWFykdbnaxFOHwwi+kNdMgU9B8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/style-resources-loader/-/style-resources-loader-1.5.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fstyle-resources-loader%2F-%2Fstyle-resources-loader-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "glob" "^7.2.0" + "loader-utils" "^2.0.0" + "schema-utils" "^2.7.0" + "tslib" "^2.3.1" + +"stylehacks@^5.1.1": + "integrity" "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==" + "resolved" "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "browserslist" "^4.21.4" + "postcss-selector-parser" "^6.0.4" + +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" + +"supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "has-flag" "^4.0.0" + +"supports-color@^8.0.0": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" + 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/-/supports-preserve-symlinks-flag-1.0.0.tgz" + "version" "1.0.0" + +"svg-tags@^1.0.0": + "integrity" "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" + "resolved" "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz" + "version" "1.0.0" + +"svgo@^2.7.0": + "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==" + "resolved" "https://registry.npmmirror.com/svgo/-/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" + +"table@^6.0.9": + "integrity" "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==" + "resolved" "https://registry.npmmirror.com/table/-/table-6.8.1.tgz" + "version" "6.8.1" + 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" + +"tapable@^2.0.0", "tapable@^2.1.1", "tapable@^2.2.0": + "integrity" "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "resolved" "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz" + "version" "2.2.1" + +"terser-webpack-plugin@^5.1.1", "terser-webpack-plugin@^5.3.7": + "integrity" "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==" + "resolved" "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + "version" "5.3.9" + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + "jest-worker" "^27.4.5" + "schema-utils" "^3.1.1" + "serialize-javascript" "^6.0.1" + "terser" "^5.16.8" + +"terser@^5.10.0", "terser@^5.16.8": + "integrity" "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==" + "resolved" "https://registry.npmmirror.com/terser/-/terser-5.19.2.tgz" + "version" "5.19.2" + dependencies: + "@jridgewell/source-map" "^0.3.3" + "acorn" "^8.8.2" + "commander" "^2.20.0" + "source-map-support" "~0.5.20" + +"text-table@^0.2.0": + "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "resolved" "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" + +"thenify-all@^1.0.0": + "integrity" "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==" + "resolved" "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz" + "version" "1.6.0" + dependencies: + "thenify" ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + "integrity" "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==" + "resolved" "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz" + "version" "3.3.1" + dependencies: + "any-promise" "^1.0.0" + +"thread-loader@^3.0.0": + "integrity" "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==" + "resolved" "https://registry.npmmirror.com/thread-loader/-/thread-loader-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "json-parse-better-errors" "^1.0.2" + "loader-runner" "^4.1.0" + "loader-utils" "^2.0.0" + "neo-async" "^2.6.2" + "schema-utils" "^3.0.0" + +"throttle-debounce@^1.0.1": + "integrity" "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==" + "resolved" "https://r2.cnpmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz" + "version" "1.1.0" + +"thunky@^1.0.2": + "integrity" "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "resolved" "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz" + "version" "1.1.0" + +"tiny-emitter@^2.0.0": + "integrity" "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/tiny-emitter/-/tiny-emitter-2.1.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Ftiny-emitter%2F-%2Ftiny-emitter-2.1.0.tgz" + "version" "2.1.0" + +"tiny-warning@^1.0.3": + "integrity" "sha1-lKMNtFPfTGQ9D9VmBg1gqHXYR1Q=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/tiny-warning/-/tiny-warning-1.0.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Ftiny-warning%2F-%2Ftiny-warning-1.0.3.tgz" + "version" "1.0.3" + +"to-fast-properties@^2.0.0": + "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + "resolved" "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + "version" "2.0.0" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"toidentifier@1.0.1": + "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "resolved" "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz" + "version" "1.0.1" + +"totalist@^1.0.0": + "integrity" "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + "resolved" "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz" + "version" "1.1.0" + +"tr46@~0.0.3": + "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "resolved" "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz" + "version" "0.0.3" + +"tslib@^2.0.3", "tslib@^2.3.1": + "integrity" "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "resolved" "https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz" + "version" "2.6.1" + +"type-check@^0.4.0", "type-check@~0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-fest@^0.20.2": + "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "resolved" "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz" + "version" "0.20.2" + +"type-fest@^0.6.0": + "integrity" "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + "resolved" "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz" + "version" "0.6.0" + +"type-fest@^0.8.1": + "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "resolved" "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz" + "version" "0.8.1" + +"type-is@~1.6.18": + "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" + "resolved" "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz" + "version" "1.6.18" + dependencies: + "media-typer" "0.3.0" + "mime-types" "~2.1.24" + +"type@^1.0.1": + "integrity" "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/type/-/type-1.2.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Ftype%2F-%2Ftype-1.2.0.tgz" + "version" "1.2.0" + +"type@^2.7.2": + "integrity" "sha1-I3ahWjoose+g9TUNz3LSTfbvmNA=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/type/-/type-2.7.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Ftype%2F-%2Ftype-2.7.2.tgz" + "version" "2.7.2" + +"unicode-canonical-property-names-ecmascript@^2.0.0": + "integrity" "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + "resolved" "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + "version" "2.0.0" + +"unicode-match-property-ecmascript@^2.0.0": + "integrity" "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==" + "resolved" "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "unicode-canonical-property-names-ecmascript" "^2.0.0" + "unicode-property-aliases-ecmascript" "^2.0.0" + +"unicode-match-property-value-ecmascript@^2.1.0": + "integrity" "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + "resolved" "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + "version" "2.1.0" + +"unicode-property-aliases-ecmascript@^2.0.0": + "integrity" "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + "resolved" "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + "version" "2.1.0" + +"universalify@^2.0.0": + "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "resolved" "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz" + "version" "2.0.0" + +"unpipe@~1.0.0", "unpipe@1.0.0": + "integrity" "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "resolved" "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz" + "version" "1.0.0" + +"update-browserslist-db@^1.0.11": + "integrity" "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==" + "resolved" "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + "version" "1.0.11" + dependencies: + "escalade" "^3.1.1" + "picocolors" "^1.0.0" + +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "^2.1.0" + +"util-deprecate@^1.0.1", "util-deprecate@^1.0.2", "util-deprecate@~1.0.1": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"utila@~0.4": + "integrity" "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "resolved" "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz" + "version" "0.4.0" + +"utils-merge@1.0.1": + "integrity" "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "resolved" "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz" + "version" "1.0.1" + +"uuid@^8.3.2": + "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "resolved" "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz" + "version" "8.3.2" + +"v8-compile-cache@^2.0.3": + "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "resolved" "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + "version" "2.3.0" + +"validate-npm-package-license@^3.0.1": + "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" + "resolved" "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "spdx-correct" "^3.0.0" + "spdx-expression-parse" "^3.0.0" + +"vary@~1.1.2": + "integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "resolved" "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz" + "version" "1.1.2" + +"vue-demi@^0.14.5": + "integrity" "sha1-Z20EY9GhJm1atcupMuBD2PXy+9k=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/vue-demi/-/vue-demi-0.14.5.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fvue-demi%2F-%2Fvue-demi-0.14.5.tgz" + "version" "0.14.5" + +"vue-eslint-parser@^8.0.1": + "integrity" "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==" + "resolved" "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz" + "version" "8.3.0" + dependencies: + "debug" "^4.3.2" + "eslint-scope" "^7.0.0" + "eslint-visitor-keys" "^3.1.0" + "espree" "^9.0.0" + "esquery" "^1.4.0" + "lodash" "^4.17.21" + "semver" "^7.3.5" + +"vue-hot-reload-api@^2.3.0": + "integrity" "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" + "resolved" "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz" + "version" "2.3.4" + +"vue-loader@^17.0.0": + "integrity" "sha512-aqNvKJvnz2A/6VWeJZodAo8XLoAlVwBv+2Z6dama+LHsAF+P/xijQ+OfWrxIs0wcGSJduvdzvTuATzXbNKkpiw==" + "resolved" "https://registry.npmmirror.com/vue-loader/-/vue-loader-17.2.2.tgz" + "version" "17.2.2" + dependencies: + "chalk" "^4.1.0" + "hash-sum" "^2.0.0" + "watchpack" "^2.4.0" + +"vue-router@^3.5.1": + "integrity" "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" + "resolved" "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz" + "version" "3.6.5" + +"vue-style-loader@^4.1.0", "vue-style-loader@^4.1.3": + "integrity" "sha1-bVWGOlH6dXqyTonZNxRlByqnvDU=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/vue-style-loader/-/vue-style-loader-4.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fvue-style-loader%2F-%2Fvue-style-loader-4.1.3.tgz" + "version" "4.1.3" + dependencies: + "hash-sum" "^1.0.2" + "loader-utils" "^1.0.2" + +"vue-template-compiler@^2.0.0", "vue-template-compiler@^2.7.14": + "integrity" "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==" + "resolved" "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz" + "version" "2.7.14" + dependencies: + "de-indent" "^1.0.2" + "he" "^1.2.0" + +"vue-template-es2015-compiler@^1.9.0": + "integrity" "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" + "resolved" "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz" + "version" "1.9.1" + +"vue@*", "vue@^2 || ^3.2.13", "vue@^2.0.0", "vue@^2.5.17", "vue@^2.6.14", "vue@^2.7.14", "vue@^3.0.0-0 || ^2.6.0": + "integrity" "sha1-N0Pc0kj9OjTUIa5Fa4ZKAka6+xc=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/vue/-/vue-2.7.14.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fvue%2F-%2Fvue-2.7.14.tgz" + "version" "2.7.14" + dependencies: + "@vue/compiler-sfc" "2.7.14" + "csstype" "^3.1.0" + +"vuedraggable@^2.24.3": + "integrity" "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==" + "resolved" "https://r2.cnpmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz" + "version" "2.24.3" + dependencies: + "sortablejs" "1.10.2" + +"vuex@^3.6.2": + "integrity" "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" + "resolved" "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz" + "version" "3.6.2" + +"watchpack@^2.4.0": + "integrity" "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==" + "resolved" "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz" + "version" "2.4.0" + dependencies: + "glob-to-regexp" "^0.4.1" + "graceful-fs" "^4.1.2" + +"wbuf@^1.1.0", "wbuf@^1.7.3": + "integrity" "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==" + "resolved" "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz" + "version" "1.7.3" + dependencies: + "minimalistic-assert" "^1.0.0" + +"wcwidth@^1.0.1": + "integrity" "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==" + "resolved" "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "defaults" "^1.0.3" + +"webidl-conversions@^3.0.0": + "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "resolved" "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + "version" "3.0.1" + +"webpack-bundle-analyzer@^4.4.0": + "integrity" "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==" + "resolved" "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz" + "version" "4.9.0" + dependencies: + "@discoveryjs/json-ext" "0.5.7" + "acorn" "^8.0.4" + "acorn-walk" "^8.0.0" + "chalk" "^4.1.0" + "commander" "^7.2.0" + "gzip-size" "^6.0.0" + "lodash" "^4.17.20" + "opener" "^1.5.2" + "sirv" "^1.0.7" + "ws" "^7.3.1" + +"webpack-chain@^6.5.1": + "integrity" "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==" + "resolved" "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-6.5.1.tgz" + "version" "6.5.1" + dependencies: + "deepmerge" "^1.5.2" + "javascript-stringify" "^2.0.1" + +"webpack-dev-middleware@^5.3.1": + "integrity" "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==" + "resolved" "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + "version" "5.3.3" + dependencies: + "colorette" "^2.0.10" + "memfs" "^3.4.3" + "mime-types" "^2.1.31" + "range-parser" "^1.2.1" + "schema-utils" "^4.0.0" + +"webpack-dev-server@^4.7.3": + "integrity" "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==" + "resolved" "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" + "version" "4.15.1" + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + "ansi-html-community" "^0.0.8" + "bonjour-service" "^1.0.11" + "chokidar" "^3.5.3" + "colorette" "^2.0.10" + "compression" "^1.7.4" + "connect-history-api-fallback" "^2.0.0" + "default-gateway" "^6.0.3" + "express" "^4.17.3" + "graceful-fs" "^4.2.6" + "html-entities" "^2.3.2" + "http-proxy-middleware" "^2.0.3" + "ipaddr.js" "^2.0.1" + "launch-editor" "^2.6.0" + "open" "^8.0.9" + "p-retry" "^4.5.0" + "rimraf" "^3.0.2" + "schema-utils" "^4.0.0" + "selfsigned" "^2.1.1" + "serve-index" "^1.9.1" + "sockjs" "^0.3.24" + "spdy" "^4.0.2" + "webpack-dev-middleware" "^5.3.1" + "ws" "^8.13.0" + +"webpack-merge@^5.7.3": + "integrity" "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==" + "resolved" "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.9.0.tgz" + "version" "5.9.0" + dependencies: + "clone-deep" "^4.0.1" + "wildcard" "^2.0.0" + +"webpack-sources@*", "webpack-sources@^3.2.3": + "integrity" "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "resolved" "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" + "version" "3.2.3" + +"webpack-virtual-modules@^0.4.2": + "integrity" "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==" + "resolved" "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz" + "version" "0.4.6" + +"webpack@^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "webpack@^3.0.0 || ^4.0.0 || ^5.0.0", "webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.1.0 || ^5.0.0-0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^5.0.0", "webpack@^5.1.0", "webpack@^5.20.0", "webpack@^5.54.0", "webpack@>=2": + "integrity" "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==" + "resolved" "https://registry.npmmirror.com/webpack/-/webpack-5.88.2.tgz" + "version" "5.88.2" + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + "acorn" "^8.7.1" + "acorn-import-assertions" "^1.9.0" + "browserslist" "^4.14.5" + "chrome-trace-event" "^1.0.2" + "enhanced-resolve" "^5.15.0" + "es-module-lexer" "^1.2.1" + "eslint-scope" "5.1.1" + "events" "^3.2.0" + "glob-to-regexp" "^0.4.1" + "graceful-fs" "^4.2.9" + "json-parse-even-better-errors" "^2.3.1" + "loader-runner" "^4.2.0" + "mime-types" "^2.1.27" + "neo-async" "^2.6.2" + "schema-utils" "^3.2.0" + "tapable" "^2.1.1" + "terser-webpack-plugin" "^5.3.7" + "watchpack" "^2.4.0" + "webpack-sources" "^3.2.3" + +"websocket-driver@^0.7.4", "websocket-driver@>=0.5.1": + "integrity" "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==" + "resolved" "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz" + "version" "0.7.4" + dependencies: + "http-parser-js" ">=0.5.1" + "safe-buffer" ">=5.1.0" + "websocket-extensions" ">=0.1.1" + +"websocket-extensions@>=0.1.1": + "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + "resolved" "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + "version" "0.1.4" + +"whatwg-fetch@^3.6.2": + "integrity" "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + "resolved" "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz" + "version" "3.6.17" + +"whatwg-url@^5.0.0": + "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" + "resolved" "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "tr46" "~0.0.3" + "webidl-conversions" "^3.0.0" + +"which-module@^2.0.0": + "integrity" "sha1-d2sf412Qrr6Z6KwV6yQJM4mkpAk=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/which-module/-/which-module-2.0.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fwhich-module%2F-%2Fwhich-module-2.0.1.tgz" + "version" "2.0.1" + +"which@^1.2.9": + "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" + "resolved" "https://registry.npmmirror.com/which/-/which-1.3.1.tgz" + "version" "1.3.1" + dependencies: + "isexe" "^2.0.0" + +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmmirror.com/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"wildcard@^1.1.0": + "integrity" "sha1-pwIEUwhNjNLv5wup02liY94XEKU=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/wildcard/-/wildcard-1.1.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fwildcard%2F-%2Fwildcard-1.1.2.tgz" + "version" "1.1.2" + +"wildcard@^2.0.0": + "integrity" "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + "resolved" "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz" + "version" "2.0.1" + +"wrap-ansi@^3.0.1": + "integrity" "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==" + "resolved" "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "string-width" "^2.1.1" + "strip-ansi" "^4.0.0" + +"wrap-ansi@^6.2.0": + "integrity" "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/wrap-ansi/-/wrap-ansi-6.2.0.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fwrap-ansi%2F-%2Fwrap-ansi-6.2.0.tgz" + "version" "6.2.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrap-ansi@^7.0.0": + "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + "resolved" "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrappy@1": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"ws@^7.3.1": + "integrity" "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" + "resolved" "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz" + "version" "7.5.9" + +"ws@^8.13.0": + "integrity" "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==" + "resolved" "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz" + "version" "8.13.0" + +"xss@^1.0.14": + "integrity" "sha1-Tz773nWtDYLpkhzDyV5lkN0zZpQ=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/xss/-/xss-1.0.14.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fxss%2F-%2Fxss-1.0.14.tgz" + "version" "1.0.14" + dependencies: + "commander" "^2.20.3" + "cssfilter" "0.0.10" + +"xxhashjs@~0.2.2": + "integrity" "sha1-imJRVnYhocRqWuIE2gJJx/jKqdg=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/xxhashjs/-/xxhashjs-0.2.2.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fxxhashjs%2F-%2Fxxhashjs-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "cuint" "^0.2.2" + +"y18n@^4.0.0": + "integrity" "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/y18n/-/y18n-4.0.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fy18n%2F-%2Fy18n-4.0.3.tgz" + "version" "4.0.3" + +"y18n@^5.0.5": + "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "resolved" "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz" + "version" "5.0.8" + +"yallist@^2.1.2": + "integrity" "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + "resolved" "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz" + "version" "2.1.2" + +"yallist@^3.0.2": + "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "resolved" "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz" + "version" "3.1.1" + +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yaml@^1.10.0", "yaml@^1.10.2": + "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "resolved" "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz" + "version" "1.10.2" + +"yargs-parser@^18.1.2": + "integrity" "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/yargs-parser/-/yargs-parser-18.1.3.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs-parser%2F-%2Fyargs-parser-18.1.3.tgz" + "version" "18.1.3" + dependencies: + "camelcase" "^5.0.0" + "decamelize" "^1.2.0" + +"yargs-parser@^20.2.2": + "integrity" "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + "resolved" "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz" + "version" "20.2.9" + +"yargs@^15.3.1": + "integrity" "sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=" + "resolved" "http://artifactory.intra.xiaojukeji.com/artifactory/api/npm/npm/yargs/-/yargs-15.4.1.tgz?dl=https%3A%2F%2Fregistry.npmmirror.com%2Fyargs%2F-%2Fyargs-15.4.1.tgz" + "version" "15.4.1" + dependencies: + "cliui" "^6.0.0" + "decamelize" "^1.2.0" + "find-up" "^4.1.0" + "get-caller-file" "^2.0.1" + "require-directory" "^2.1.1" + "require-main-filename" "^2.0.0" + "set-blocking" "^2.0.0" + "string-width" "^4.2.0" + "which-module" "^2.0.0" + "y18n" "^4.0.0" + "yargs-parser" "^18.1.2" + +"yargs@^16.0.0": + "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" + "resolved" "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz" + "version" "16.2.0" + dependencies: + "cliui" "^7.0.2" + "escalade" "^3.1.1" + "get-caller-file" "^2.0.5" + "require-directory" "^2.1.1" + "string-width" "^4.2.0" + "y18n" "^5.0.5" + "yargs-parser" "^20.2.2" + +"yorkie@^2.0.0": + "integrity" "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==" + "resolved" "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "execa" "^0.8.0" + "is-ci" "^1.0.10" + "normalize-path" "^1.0.0" + "strip-indent" "^2.0.0"