diff --git a/.gitignore b/.gitignore index 04aab4802..83520bb82 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,6 @@ build/ ### VS Code ### .vscode/ -/blog-cms-tmp \ No newline at end of file +.DS_Store +/blog-cms-tmp +package-lock.json diff --git a/README.md b/README.md index f6b190455..388b27c07 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- NBlog logo + NBlog logo

@@ -14,15 +14,18 @@ + ## 简介 -本着『前后端分离,人不分离』的要领,开发了此基于 Spring Boot + Vue 前后端分离博客系统 +Spring Boot + Vue「前后端分离,人不分离」博客系统 + +自用博客,长期维护,欢迎勘误 预览地址: 前台:[https://naccl.top](https://naccl.top) -后台:[https://admin.naccl.top](https://admin.naccl.top) 账号`Visitor`密码`123456` +后台:[https://admin.naccl.top](https://admin.naccl.top) @@ -30,10 +33,10 @@ 1. 核心框架:[Spring Boot](https://github.com/spring-projects/spring-boot) 2. 安全框架:[Spring Security](https://github.com/spring-projects/spring-security) -3. Token 认证:[jjwt](https://github.com/jwtk/jjwt) -4. 持久层框架:[MyBatis](https://github.com/mybatis/spring-boot-starter) +3. Token:[jjwt](https://github.com/jwtk/jjwt) +4. ORM 框架:[MyBatis](https://github.com/mybatis/spring-boot-starter) 5. 分页插件:[PageHelper](https://github.com/pagehelper/Mybatis-PageHelper) -6. NoSQL缓存:[Redis](https://github.com/redis/redis) +6. NoSQL 缓存:[Redis](https://github.com/redis/redis) 7. Markdown 转 HTML:[commonmark-java](https://github.com/commonmark/commonmark-java) 8. 离线 IP 地址库:[ip2region](https://github.com/lionsoul2014/ip2region) 9. 定时任务:[quartz](https://github.com/quartz-scheduler/quartz) @@ -41,17 +44,7 @@ -邮件模板参考自[Typecho-CommentToMail-Template](https://github.com/MisakaTAT/Typecho-CommentToMail-Template) - -基于 JDK8 开发,8以上要添加依赖: - -```xml - - javax.xml.bind - jaxb-api - 2.3.0 - -``` +邮件模板参考自 [Typecho-CommentToMail-Template](https://github.com/MisakaTAT/Typecho-CommentToMail-Template) @@ -63,11 +56,13 @@ Vue 项目基于 @vue/cli4.x 构建 JS 依赖及参考的 css:[axios](https://github.com/axios/axios)、[moment](https://github.com/moment/moment)、[nprogress](https://github.com/rstacruz/nprogress)、[v-viewer](https://github.com/fengyuanchen/viewerjs)、[prismjs](https://github.com/PrismJS/prism)、[APlayer](https://github.com/DIYgod/APlayer)、[MetingJS](https://github.com/metowolf/MetingJS)、[lodash](https://github.com/lodash/lodash)、[mavonEditor](https://github.com/hinesboy/mavonEditor)、[echarts](https://github.com/apache/echarts)、[tocbot](https://github.com/tscanlin/tocbot)、[iCSS](https://github.com/chokcoco/iCSS) +**由 [@willWang8023](https://github.com/willWang8023) 维护的 Vue3 版本请查看 [blog-view-vue3](https://github.com/willWang8023/blog-view-vue3)** + ### 后台 UI -后台 CMS 部分基于 [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) 二次修改后的 [my-vue-admin-template](https://github.com/Naccl/my-vue-admin-template) 模板进行开发(于2021年11月1日重构过一次,[重构 commit](https://github.com/Naccl/NBlog/commit/b33641fe34b2bed34e8237bacf67146cd64be4cf)) +后台基于 [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) 二次修改后的 [my-vue-admin-template](https://github.com/Naccl/my-vue-admin-template) 模板进行开发([于2021年11月1日重构](https://github.com/Naccl/NBlog/commit/b33641fe34b2bed34e8237bacf67146cd64be4cf)) UI 框架为 [Element UI](https://github.com/ElemeFE/element) @@ -83,10 +78,28 @@ UI 框架为 [Element UI](https://github.com/ElemeFE/element) -## 快速开始 +## Telegram Bot 快捷操作 + +| 桌面 | Phone | Phone | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| ![桌面客户端效果图](./pic/TelegramBot.png "桌面客户端效果图") | ![手机客户端效果图1](./pic/TgBotPhone1.png "手机客户端效果图1") | ![手机客户端效果图2](./pic/TgBotPhone2.png "手机客户端效果图2") | + +若要启用该功能,参考以下步骤: + +1. 向 @BotFather 申请一个 Bot,得到该 Bot 的`token`,格式如`1234567890:qwertyuiopasdfghjklzxcvbnm` +2. 与该 Bot 私聊,随便发个消息,然后打开此链接`https://api.telegram.org/bot/getUpdates`(替换链接中的 token),在`result -> message -> chat -> id`得到`chatId` +3. 将获取的`token`和`chatId`填入`application-dev.properties`,并启用`comment.notify.channel=tg` +4. 由于目前仅提供 webhook 的方式获取消息更新,所以`application-dev.properties`中的`blog.api`需要填写后端 API 的地址,并且**必须是`https`(Telegram 的要求)**,也就是说如果你没有公网 IP 或内网穿透或反向代理,那么在本地环境是无法测试的,建议直接扔服务器上 +5. 国内通常情况下无法访问 TG 的 API,因此提供了两种方式 + 1. 正向代理:配置`http.proxy.server`,通过你的代理发送请求 + 2. 反向代理:可以直接使用我跑在 Cloudflare Workers 上的反代,默认配置即可。示例代码已放在`blog-api/cfworker-tg-api-open.js`,可自行搭建(**22.05.12 更新,近两天大陆绝大多数地区 `*.workers.dev` 域名已被墙,因此若仍想使用此反代方式访问 cf worker,需要将 Worker 绑定路由至自己的域名,详见[相关讨论](https://github.com/XIU2/CloudflareSpeedTest/issues/205)**) + + + +## 开发环境 1. 创建 MySQL 数据库`nblog`,并执行`/blog-api/nblog.sql`初始化表数据 -2. 修改配置信息`blog-api/src/main/resources/application-dev.properties` +2. 修改配置信息`/blog-api/src/main/resources/application-dev.properties` 3. 安装 Redis 并启动 4. 启动后端服务 5. 分别在`blog-cms`和`blog-view`目录下执行`npm install`安装依赖 @@ -96,15 +109,16 @@ UI 框架为 [Element UI](https://github.com/ElemeFE/element) ## 注意事项 -最近逐渐有些小伙伴关注此项目,表示不知如何部署,或部署过程中有一些问题不知如何解决,在这里把过程中可能遇到的一些问题描述一下: +一些常见问题: -- 本人使用的 MySQL 版本为 8.x,5.x 版本未经测试,但确保数据库字符集为`utf8mb4`的情况下通常没有问题("站点设置"及"文章详情"等许多表字段需要`utf8mb4`格式字符集来支持emoji表情,否则在导入 sql 文件时,即使成功导入,也会有部分字段内容不完整,导致前端页面渲染数据时报错) -- 确保 Maven 能够成功导入现版本依赖(已知 [yauaa](https://github.com/nielsbasjes/yauaa) 依赖在用更高版本替换后,以现在的写法运行会报错) +- MySQL 确保数据库字符集为`utf8mb4`("站点设置"及"文章详情"等许多表字段需要`utf8mb4`格式字符集来支持 emoji 表情,否则在导入 sql 文件时,即使成功导入,也会有部分字段内容不完整,导致前端页面渲染数据时报错) +- 确保 Maven 和 NPM 能够成功导入现版本依赖,请勿升级或降低依赖版本 - 数据库中默认用户名密码为`Admin`,`123456`,因为是个人博客,没打算做修改密码的页面,可在`top.naccl.util.HashUtils`下的`main`方法手动生成密码存入数据库 - 注意修改`application-dev.properties`的配置信息 - - Redis 若没有密码,留空即可 - 注意修改`token.secretKey`,否则无法保证 token 安全性 - - `spring.mail.host`及`spring.mail.port`的默认配置为阿里云邮箱,其它邮箱服务商参考关键字`spring mail 服务器`(邮箱配置用于接收评论提醒) + - `spring.mail.host`及`spring.mail.port`的默认配置为阿里云邮箱,其它邮箱服务商参考关键字`spring mail 服务器`(邮箱配置用于接收/发送评论提醒) +- 如需部署,注意将`/blog-view/src/plugins/axios.js`和`/blog-cms/src/util/request.js`中的`baseUrl`修改为你的后端 API 地址 +- 大部分个性化配置可以在后台"站点设置"中修改,小部分由于考虑到首屏加载速度(如首页大图)需要修改前端源码 @@ -113,20 +127,17 @@ UI 框架为 [Element UI](https://github.com/ElemeFE/element) - 在前台访问`/login`路径登录后,可以以博主身份(带有博主标识)回复评论,且不需要填写昵称和邮箱即可提交 - 在 Markdown 中加入`` (注意以正文形式添加,而不是代码片段)可以在文章中添加 [APlayer](https://github.com/DIYgod/APlayer) 音乐播放器,`netease`为网易云音乐,其它配置及具体用法参考 [MetingJS](https://github.com/metowolf/MetingJS) - 提供了两种隐藏文字效果:在 Markdown 中使用`@@`包住文字,文字会被渲染成"黑幕"效果,鼠标悬浮在上面时才会显示;使用`%%`包住文字,文字会被"蓝色覆盖层"遮盖,只有鼠标选中状态才会反色显示。例如:`@@隐藏文字@@`,`%%隐藏文字%%` -- 大部分个性化配置可以在后台"站点设置"中修改,小部分由于考虑到首屏加载速度(如首页大图)需要修改前端源码,通过 IDE 全局查找应该可以很快定位 - -## And... -由于一些技术是现学现用的,难免有些考虑不周,望大佬们能够指出错误 +## LICENSE -自用博客,长期维护,欢迎勘误 +[MIT](https://github.com/Naccl/NBlog/blob/master/LICENSE) -## 致谢 +## Thanks -感谢 [JetBrains](https://www.jetbrains.com/) 提供的非商业开源软件 License +感谢 [JetBrains](https://www.jetbrains.com/?from=NBlog) 提供的 Open Source License -此项目本是学习过程中的产物,参考了许多优秀的教程和项目,由于比较零散,难以统计,如大佬能看到此,请及时与我联系,以便表示感谢 +感谢上面提到的每个开源项目 diff --git a/blog-api/.gitignore b/blog-api/.gitignore index b77b6cca3..2ced2fc6c 100644 --- a/blog-api/.gitignore +++ b/blog-api/.gitignore @@ -33,4 +33,5 @@ build/ .vscode/ log -application-prod.properties \ No newline at end of file +application-test.properties +application-prod.properties diff --git a/blog-api/cfworker-tg-api-open.js b/blog-api/cfworker-tg-api-open.js new file mode 100644 index 000000000..232bf3dde --- /dev/null +++ b/blog-api/cfworker-tg-api-open.js @@ -0,0 +1,37 @@ +addEventListener("fetch", event => { + let response = handleRequest(event.request) + return event.respondWith(response) +}) + +async function handleRequest(request) { + const { method, headers } = request + + if (method === "POST" && headers.get("content-type") === "application/json") { + const json = await request.json() + const toUrl = json.to + console.log(toUrl) + const data = json.data + let response = await fetch(toUrl, { + method: "POST", + headers, + body: JSON.stringify(data) + }) + const results = await gatherResponse(response) + return new Response(results, { + headers: { + "content-type": "application/json;charset=UTF-8", + }, + }) + } + return new Response("error", { status: 403 }) +} + +async function gatherResponse(response) { + const { headers } = response + const contentType = headers.get("content-type") || "" + if (contentType.includes("application/json")) { + return JSON.stringify(await response.json()) + } else { + return response.text() + } +} \ No newline at end of file diff --git a/blog-api/nblog.sql b/blog-api/nblog.sql index a92e64d6b..d877b3ce9 100644 --- a/blog-api/nblog.sql +++ b/blog-api/nblog.sql @@ -244,34 +244,38 @@ CREATE TABLE `site_setting` ( -- ---------------------------- -- Records of site_setting -- ---------------------------- -INSERT INTO `site_setting` VALUES (1, 'webTitleSuffix', '网页标题后缀', ' - Naccl\'s Blog', 1); -INSERT INTO `site_setting` VALUES (2, 'blogName', '博客名称', 'Naccl\'s Blog', 1); +INSERT INTO `site_setting` VALUES (1, 'blogName', '博客名称', 'Naccl\'s Blog', 1); +INSERT INTO `site_setting` VALUES (2, 'webTitleSuffix', '网页标题后缀', ' - Naccl\'s Blog', 1); INSERT INTO `site_setting` VALUES (3, 'footerImgTitle', '页脚图片标题', '手机看本站', 1); INSERT INTO `site_setting` VALUES (4, 'footerImgUrl', '页脚图片路径', '/img/qr.png', 1); -INSERT INTO `site_setting` VALUES (5, 'copyright', 'Copyright', '{\"title\":\"Copyright © 2019 - 2020\",\"siteName\":\"NACCL\'S BLOG\"}', 1); +INSERT INTO `site_setting` VALUES (5, 'copyright', 'Copyright', '{\"title\":\"Copyright © 2019 - 2022\",\"siteName\":\"NACCL\'S BLOG\"}', 1); INSERT INTO `site_setting` VALUES (6, 'beian', 'ICP备案号', '', 1); -INSERT INTO `site_setting` VALUES (7, 'badge', '徽标', '{\"title\":\"由 Spring Boot 强力驱动\",\"url\":\"https://spring.io/projects/spring-boot/\",\"subject\":\"Powered\",\"value\":\"Spring Boot\",\"color\":\"blue\"}', 2); -INSERT INTO `site_setting` VALUES (8, 'badge', '徽标', '{\"title\":\"Vue.js 客户端渲染\",\"url\":\"https://cn.vuejs.org/\",\"subject\":\"SPA\",\"value\":\"Vue.js\",\"color\":\"brightgreen\"}', 2); -INSERT INTO `site_setting` VALUES (9, 'badge', '徽标', '{\"title\":\"UI 框架 Semantic-UI\",\"url\":\"https://semantic-ui.com/\",\"subject\":\"UI\",\"value\":\"Semantic-UI\",\"color\":\"semantic-ui\"}', 2); -INSERT INTO `site_setting` VALUES (10, 'badge', '徽标', '{\"title\":\"阿里云提供服务器及域名相关服务\",\"url\":\"https://www.aliyun.com/\",\"subject\":\"VPS & DNS\",\"value\":\"Aliyun\",\"color\":\"blueviolet\"}', 2); -INSERT INTO `site_setting` VALUES (11, 'badge', '徽标', '{\"title\":\"jsDelivr 提供 CDN 加速服务\",\"url\":\"https://www.jsdelivr.com/\",\"subject\":\"CDN\",\"value\":\"jsDelivr\",\"color\":\"orange\"}', 2); -INSERT INTO `site_setting` VALUES (12, 'badge', '徽标', '{\"title\":\"GitHub 提供图床\",\"url\":\"https://github.com/\",\"subject\":\"OSS\",\"value\":\"GitHub\",\"color\":\"github\"}', 2); -INSERT INTO `site_setting` VALUES (13, 'badge', '徽标', '{\"title\":\"本站点采用 CC BY 4.0 国际许可协议进行许可\",\"url\":\"https://creativecommons.org/licenses/by/4.0/\",\"subject\":\"CC\",\"value\":\"BY 4.0\",\"color\":\"lightgray\"}', 2); -INSERT INTO `site_setting` VALUES (14, 'avatar', '图片路径', '/img/avatar.jpg', 3); -INSERT INTO `site_setting` VALUES (15, 'name', '昵称', 'Naccl', 3); -INSERT INTO `site_setting` VALUES (16, 'rollText', '滚动个签', '\"云鹤当归天,天不迎我妙木仙;\",\"游龙当归海,海不迎我自来也。\"', 3); -INSERT INTO `site_setting` VALUES (17, 'github', 'GitHub地址', 'https://github.com/Naccl', 3); -INSERT INTO `site_setting` VALUES (18, 'qq', 'QQ链接', 'http://sighttp.qq.com/authd?IDKEY=', 3); -INSERT INTO `site_setting` VALUES (19, 'bilibili', 'bilibili链接', 'https://space.bilibili.com/', 3); -INSERT INTO `site_setting` VALUES (20, 'netease', '网易云音乐', 'https://music.163.com/#/user/home?id=', 3); -INSERT INTO `site_setting` VALUES (21, 'email', 'email', 'mailto:i@naccl.top', 3); -INSERT INTO `site_setting` VALUES (22, 'favorite', '自定义', '{\"title\":\"最喜欢的动漫 📺\",\"content\":\"异度侵入、春物语、NO GAME NO LIFE、实力至上主义的教室、辉夜大小姐、青春猪头少年不会梦到兔女郎学姐、路人女主、Re0、魔禁、超炮、俺妹、在下坂本、散华礼弥、OVERLORD、慎勇、人渣的本愿、白色相簿2、死亡笔记、DARLING in the FRANXX、鬼灭之刃\"}', 3); -INSERT INTO `site_setting` VALUES (23, 'favorite', '自定义', '{\"title\":\"最喜欢我的女孩子们 🤤\",\"content\":\"芙兰达、土间埋、食蜂操祈、佐天泪爷、樱岛麻衣、桐崎千棘、02、亚丝娜、高坂桐乃、五更琉璃、安乐冈花火、一色彩羽、英梨梨、珈百璃、时崎狂三、可儿那由多、和泉纱雾、早坂爱\"}', 3); -INSERT INTO `site_setting` VALUES (24, 'favorite', '自定义', '{\"title\":\"最喜欢玩的游戏 🎮\",\"content\":\"Stellaris、巫师、GTA、荒野大镖客、刺客信条、魔兽争霸、LOL、PUBG\"}', 3); -INSERT INTO `site_setting` VALUES (25, 'reward', '赞赏码路径', '/img/reward.jpg', 1); -INSERT INTO `site_setting` VALUES (26, 'commentAdminFlag', '博主评论标识', '咕咕', 1); -INSERT INTO `site_setting` VALUES (27, 'friendContent', '友链页面信息', '随机排序,不分先后。欢迎交换友链~( ̄▽ ̄)~*\n\n* 昵称:Naccl\n* 一句话:游龙当归海,海不迎我自来也。\n* 网址:[https://naccl.top](https://naccl.top)\n* 头像URL:[https://naccl.top/img/avatar.jpg](https://naccl.top/img/avatar.jpg)\n\n仅凭个人喜好添加友链,请在收到我的回复邮件后再于贵站添加本站链接。原则上已添加的友链不会删除,如果你发现自己被移除了,恕不另行通知,只需和我一样做就好。\n\n', 4); -INSERT INTO `site_setting` VALUES (28, 'friendCommentEnabled', '友链页面评论开关', '1', 4); +INSERT INTO `site_setting` VALUES (7, 'reward', '赞赏码', '/img/reward.jpg', 1); +INSERT INTO `site_setting` VALUES (8, 'commentAdminFlag', '博主评论标识', '咕咕', 1); +INSERT INTO `site_setting` VALUES (9, 'playlistServer', '播放器平台', 'netease', 1); +INSERT INTO `site_setting` VALUES (10, 'playlistId', '播放器歌单', '3071528549', 1); +INSERT INTO `site_setting` VALUES (11, 'avatar', '头像', '/img/avatar.jpg', 2); +INSERT INTO `site_setting` VALUES (12, 'name', '昵称', 'Naccl', 2); +INSERT INTO `site_setting` VALUES (13, 'rollText', '滚动个签', '\"云鹤当归天,天不迎我妙木仙;\",\"游龙当归海,海不迎我自来也。\"', 2); +INSERT INTO `site_setting` VALUES (14, 'github', 'GitHub', 'https://github.com/Naccl', 2); +INSERT INTO `site_setting` VALUES (15, 'telegram', 'Telegram', 'https://t.me/NacclOfficial', 2); +INSERT INTO `site_setting` VALUES (16, 'qq', 'QQ', 'http://sighttp.qq.com/authd?IDKEY=', 2); +INSERT INTO `site_setting` VALUES (17, 'bilibili', 'bilibili', 'https://space.bilibili.com/', 2); +INSERT INTO `site_setting` VALUES (18, 'netease', '网易云音乐', 'https://music.163.com/#/user/home?id=', 2); +INSERT INTO `site_setting` VALUES (19, 'email', 'email', 'mailto:you@example.com', 2); +INSERT INTO `site_setting` VALUES (20, 'favorite', '自定义', '{\"title\":\"最喜欢的动漫 📺\",\"content\":\"异度侵入、春物语、NO GAME NO LIFE、实力至上主义的教室、辉夜大小姐、青春猪头少年不会梦到兔女郎学姐、路人女主、Re0、魔禁、超炮、俺妹、在下坂本、散华礼弥、OVERLORD、慎勇、人渣的本愿、白色相簿2、死亡笔记、DARLING in the FRANXX、鬼灭之刃\"}', 2); +INSERT INTO `site_setting` VALUES (21, 'favorite', '自定义', '{\"title\":\"最喜欢我的女孩子们 🤤\",\"content\":\"芙兰达、土间埋、食蜂操祈、佐天泪爷、樱岛麻衣、桐崎千棘、02、亚丝娜、高坂桐乃、五更琉璃、安乐冈花火、一色彩羽、英梨梨、珈百璃、时崎狂三、可儿那由多、和泉纱雾、早坂爱\"}', 2); +INSERT INTO `site_setting` VALUES (22, 'favorite', '自定义', '{\"title\":\"最喜欢玩的游戏 🎮\",\"content\":\"Stellaris、巫师、GTA、荒野大镖客、刺客信条、魔兽争霸、LOL、PUBG\"}', 2); +INSERT INTO `site_setting` VALUES (23, 'badge', '徽标', '{\"title\":\"本博客已开源于 GitHub\",\"url\":\"https://github.com/Naccl/NBlog\",\"subject\":\"NBlog\",\"value\":\"Open Source\",\"color\":\"brightgreen\"}', 3); +INSERT INTO `site_setting` VALUES (24, 'badge', '徽标', '{\"title\":\"由 Spring Boot 强力驱动\",\"url\":\"https://spring.io/projects/spring-boot/\",\"subject\":\"Powered\",\"value\":\"Spring Boot\",\"color\":\"blue\"}', 3); +INSERT INTO `site_setting` VALUES (25, 'badge', '徽标', '{\"title\":\"Vue.js 客户端渲染\",\"url\":\"https://cn.vuejs.org/\",\"subject\":\"SPA\",\"value\":\"Vue.js\",\"color\":\"brightgreen\"}', 3); +INSERT INTO `site_setting` VALUES (26, 'badge', '徽标', '{\"title\":\"UI 框架 Semantic-UI\",\"url\":\"https://semantic-ui.com/\",\"subject\":\"UI\",\"value\":\"Semantic-UI\",\"color\":\"semantic-ui\"}', 3); +INSERT INTO `site_setting` VALUES (27, 'badge', '徽标', '{\"title\":\"阿里云提供服务器及域名相关服务\",\"url\":\"https://www.aliyun.com/\",\"subject\":\"VPS & DNS\",\"value\":\"Aliyun\",\"color\":\"blueviolet\"}', 3); +INSERT INTO `site_setting` VALUES (28, 'badge', '徽标', '{\"title\":\"静态资源托管于 GitHub\",\"url\":\"https://github.com/\",\"subject\":\"OSS\",\"value\":\"GitHub\",\"color\":\"github\"}', 3); +INSERT INTO `site_setting` VALUES (29, 'badge', '徽标', '{\"title\":\"jsDelivr 加速静态资源\",\"url\":\"https://www.jsdelivr.com/\",\"subject\":\"CDN\",\"value\":\"jsDelivr\",\"color\":\"orange\"}', 3); +INSERT INTO `site_setting` VALUES (30, 'badge', '徽标', '{\"color\":\"lightgray\",\"subject\":\"CC\",\"title\":\"本站点采用 CC BY 4.0 国际许可协议进行许可\",\"url\":\"https://creativecommons.org/licenses/by/4.0/\",\"value\":\"BY 4.0\"}', 3); +INSERT INTO `site_setting` VALUES (31, 'friendContent', '友链页面信息', '随机排序,不分先后。欢迎交换友链~( ̄▽ ̄)~*\n\n* 昵称:Naccl\n* 一句话:游龙当归海,海不迎我自来也。\n* 网址:[https://naccl.top](https://naccl.top)\n* 头像URL:[https://naccl.top/img/avatar.jpg](https://naccl.top/img/avatar.jpg)\n\n仅凭个人喜好添加友链,请在收到我的回复邮件后再于贵站添加本站链接。原则上已添加的友链不会删除,如果你发现自己被移除了,恕不另行通知,只需和我一样做就好。\n\n', 4); +INSERT INTO `site_setting` VALUES (32, 'friendCommentEnabled', '友链页面评论开关', '1', 4); -- ---------------------------- -- Table structure for tag @@ -356,7 +360,8 @@ CREATE TABLE `visitor` ( `last_time` datetime(0) NOT NULL COMMENT '最后访问时间', `pv` int(0) NULL DEFAULT NULL COMMENT '访问页数统计', `user_agent` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'user-agent用户代理', - PRIMARY KEY (`id`) USING BTREE + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `idx_uuid` (`uuid`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; diff --git a/blog-api/pom.xml b/blog-api/pom.xml index 0d77193b2..aed43a72c 100644 --- a/blog-api/pom.xml +++ b/blog-api/pom.xml @@ -20,6 +20,7 @@ 1.8 1.8 UTF-8 + 2.17.2 @@ -38,6 +39,11 @@ org.springframework.boot spring-boot-starter-aop + + + org.springframework.retry + spring-retry + org.mybatis.spring.boot @@ -70,29 +76,29 @@ - com.atlassian.commonmark + org.commonmark commonmark - 0.15.2 + 0.18.1 - com.atlassian.commonmark + org.commonmark commonmark-ext-heading-anchor - 0.15.2 + 0.18.1 - com.atlassian.commonmark + org.commonmark commonmark-ext-gfm-tables - 0.15.2 + 0.18.1 - com.atlassian.commonmark + org.commonmark commonmark-ext-gfm-strikethrough - 0.15.2 + 0.18.1 - com.atlassian.commonmark + org.commonmark commonmark-ext-task-list-items - 0.15.2 + 0.18.1 @@ -118,13 +124,31 @@ org.lionsoul ip2region - 1.7.2 + 2.6.5 nl.basjes.parse.useragent yauaa - 5.20 + 7.11.0 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.upyun + java-sdk + 4.2.3 + + + + cn.hutool + hutool-crypto + 5.8.11 diff --git a/blog-api/src/main/java/top/naccl/annotation/VisitLogger.java b/blog-api/src/main/java/top/naccl/annotation/VisitLogger.java index 96f9ccf49..321578024 100644 --- a/blog-api/src/main/java/top/naccl/annotation/VisitLogger.java +++ b/blog-api/src/main/java/top/naccl/annotation/VisitLogger.java @@ -1,5 +1,7 @@ package top.naccl.annotation; +import top.naccl.enums.VisitBehavior; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -13,13 +15,8 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface VisitLogger { - /** - * 访问行为 - */ - String behavior() default ""; - - /** - * 访问内容 - */ - String content() default ""; + /** + * 访问行为枚举 + */ + VisitBehavior value() default VisitBehavior.UNKNOWN; } diff --git a/blog-api/src/main/java/top/naccl/aspect/ExceptionLogAspect.java b/blog-api/src/main/java/top/naccl/aspect/ExceptionLogAspect.java index c24ef62b0..12171b932 100644 --- a/blog-api/src/main/java/top/naccl/aspect/ExceptionLogAspect.java +++ b/blog-api/src/main/java/top/naccl/aspect/ExceptionLogAspect.java @@ -58,7 +58,6 @@ private ExceptionLog handleLog(JoinPoint joinPoint, Exception e) { String method = request.getMethod(); String ip = IpAddressUtils.getIpAddress(request); String userAgent = request.getHeader("User-Agent"); - //todo 使用swagger后,可以直接使用注解上的内容作为 ExceptionLog 的 description String description = getDescriptionFromAnnotations(joinPoint); String error = StringUtils.getStackTrace(e); ExceptionLog log = new ExceptionLog(uri, method, description, error, ip, userAgent); @@ -68,18 +67,15 @@ private ExceptionLog handleLog(JoinPoint joinPoint, Exception e) { } private String getDescriptionFromAnnotations(JoinPoint joinPoint) { - String description = ""; Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); OperationLogger operationLogger = method.getAnnotation(OperationLogger.class); if (operationLogger != null) { - description = operationLogger.value(); - return description; + return operationLogger.value(); } VisitLogger visitLogger = method.getAnnotation(VisitLogger.class); if (visitLogger != null) { - description = visitLogger.behavior(); - return description; + return visitLogger.value().getBehavior(); } - return description; + return ""; } -} \ No newline at end of file +} diff --git a/blog-api/src/main/java/top/naccl/aspect/VisitLogAspect.java b/blog-api/src/main/java/top/naccl/aspect/VisitLogAspect.java index 5ab0399eb..52e1df0b3 100644 --- a/blog-api/src/main/java/top/naccl/aspect/VisitLogAspect.java +++ b/blog-api/src/main/java/top/naccl/aspect/VisitLogAspect.java @@ -9,9 +9,11 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import top.naccl.annotation.VisitLogger; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.VisitLog; import top.naccl.entity.Visitor; +import top.naccl.enums.VisitBehavior; +import top.naccl.model.dto.VisitLogRemark; import top.naccl.model.vo.BlogDetail; import top.naccl.model.vo.Result; import top.naccl.service.RedisService; @@ -25,7 +27,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Calendar; -import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -63,7 +64,7 @@ public void logPointcut(VisitLogger visitLogger) { @Around("logPointcut(visitLogger)") public Object logAround(ProceedingJoinPoint joinPoint, VisitLogger visitLogger) throws Throwable { currentTime.set(System.currentTimeMillis()); - Object result = joinPoint.proceed(); + Result result = (Result) joinPoint.proceed(); int times = (int) (System.currentTimeMillis() - currentTime.get()); currentTime.remove(); //获取请求对象 @@ -89,14 +90,14 @@ private String checkIdentification(HttpServletRequest request) { identification = saveUUID(request); } else { //校验Redis中是否存在uuid - boolean redisHas = redisService.hasValueInSet(RedisKeyConfig.IDENTIFICATION_SET, identification); + boolean redisHas = redisService.hasValueInSet(RedisKeyConstants.IDENTIFICATION_SET, identification); //Redis中不存在uuid if (!redisHas) { //校验数据库中是否存在uuid boolean mysqlHas = visitorService.hasUUID(identification); if (mysqlHas) { //数据库存在,保存至Redis - redisService.saveValueToSet(RedisKeyConfig.IDENTIFICATION_SET, identification); + redisService.saveValueToSet(RedisKeyConstants.IDENTIFICATION_SET, identification); } else { //数据库不存在,签发新的uuid identification = saveUUID(request); @@ -131,10 +132,10 @@ private String saveUUID(HttpServletRequest request) { //暴露自定义header供页面资源使用 response.addHeader("Access-Control-Expose-Headers", "identification"); //校验Redis中是否存在uuid - boolean redisHas = redisService.hasValueInSet(RedisKeyConfig.IDENTIFICATION_SET, uuid); + boolean redisHas = redisService.hasValueInSet(RedisKeyConstants.IDENTIFICATION_SET, uuid); if (!redisHas) { //保存至Redis - redisService.saveValueToSet(RedisKeyConfig.IDENTIFICATION_SET, uuid); + redisService.saveValueToSet(RedisKeyConstants.IDENTIFICATION_SET, uuid); //保存至数据库 Visitor visitor = new Visitor(uuid, ip, userAgent); visitorService.saveVisitor(visitor); @@ -151,17 +152,16 @@ private String saveUUID(HttpServletRequest request) { * @param times * @return */ - private VisitLog handleLog(ProceedingJoinPoint joinPoint, VisitLogger visitLogger, HttpServletRequest request, Object result, + private VisitLog handleLog(ProceedingJoinPoint joinPoint, VisitLogger visitLogger, HttpServletRequest request, Result result, int times, String identification) { String uri = request.getRequestURI(); String method = request.getMethod(); - String behavior = visitLogger.behavior(); - String content = visitLogger.content(); String ip = IpAddressUtils.getIpAddress(request); String userAgent = request.getHeader("User-Agent"); Map requestParams = AopUtils.getRequestParams(joinPoint); - Map map = judgeBehavior(behavior, content, requestParams, result); - VisitLog log = new VisitLog(identification, uri, method, behavior, map.get("content"), map.get("remark"), ip, times, userAgent); + VisitLogRemark visitLogRemark = judgeBehavior(visitLogger.value(), requestParams, result); + VisitLog log = new VisitLog(identification, uri, method, visitLogger.value().getBehavior(), + visitLogRemark.getContent(), visitLogRemark.getRemark(), ip, times, userAgent); log.setParam(StringUtils.substring(JacksonUtils.writeValueAsString(requestParams), 0, 2000)); return log; } @@ -170,49 +170,49 @@ private VisitLog handleLog(ProceedingJoinPoint joinPoint, VisitLogger visitLogge * 根据访问行为,设置对应的访问内容或备注 * * @param behavior - * @param content * @param requestParams * @param result * @return */ - private Map judgeBehavior(String behavior, String content, Map requestParams, Object result) { - Map map = new HashMap(); + private VisitLogRemark judgeBehavior(VisitBehavior behavior, Map requestParams, Result result) { String remark = ""; - if (behavior.equals("访问页面") && (content.equals("首页") || content.equals("动态"))) { - int pageNum = (int) requestParams.get("pageNum"); - remark = "第" + pageNum + "页"; - } else if (behavior.equals("查看博客")) { - Result res = (Result) result; - if (res.getCode() == 200) { - BlogDetail blog = (BlogDetail) res.getData(); - String title = blog.getTitle(); - content = title; - remark = "文章标题:" + title; - } - } else if (behavior.equals("搜索博客")) { - Result res = (Result) result; - if (res.getCode() == 200) { - String query = (String) requestParams.get("query"); - content = query; - remark = "搜索内容:" + query; - } - } else if (behavior.equals("查看分类")) { - String categoryName = (String) requestParams.get("categoryName"); - int pageNum = (int) requestParams.get("pageNum"); - content = categoryName; - remark = "分类名称:" + categoryName + ",第" + pageNum + "页"; - } else if (behavior.equals("查看标签")) { - String tagName = (String) requestParams.get("tagName"); - int pageNum = (int) requestParams.get("pageNum"); - content = tagName; - remark = "标签名称:" + tagName + ",第" + pageNum + "页"; - } else if (behavior.equals("点击友链")) { - String nickname = (String) requestParams.get("nickname"); - content = nickname; - remark = "友链名称:" + nickname; + String content = behavior.getContent(); + switch (behavior) { + case INDEX: + case MOMENT: + remark = "第" + requestParams.get("pageNum") + "页"; + break; + case BLOG: + if (result.getCode() == 200) { + BlogDetail blog = (BlogDetail) result.getData(); + String title = blog.getTitle(); + content = title; + remark = "文章标题:" + title; + } + break; + case SEARCH: + if (result.getCode() == 200) { + String query = (String) requestParams.get("query"); + content = query; + remark = "搜索内容:" + query; + } + break; + case CATEGORY: + String categoryName = (String) requestParams.get("categoryName"); + content = categoryName; + remark = "分类名称:" + categoryName + ",第" + requestParams.get("pageNum") + "页"; + break; + case TAG: + String tagName = (String) requestParams.get("tagName"); + content = tagName; + remark = "标签名称:" + tagName + ",第" + requestParams.get("pageNum") + "页"; + break; + case CLICK_FRIEND: + String nickname = (String) requestParams.get("nickname"); + content = nickname; + remark = "友链名称:" + nickname; + break; } - map.put("remark", remark); - map.put("content", content); - return map; + return new VisitLogRemark(content, remark); } } \ No newline at end of file diff --git a/blog-api/src/main/java/top/naccl/config/JwtFilter.java b/blog-api/src/main/java/top/naccl/config/JwtFilter.java index b4ef6de8a..85041db7b 100644 --- a/blog-api/src/main/java/top/naccl/config/JwtFilter.java +++ b/blog-api/src/main/java/top/naccl/config/JwtFilter.java @@ -31,7 +31,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //后台管理路径外的请求直接跳过 - if (!request.getRequestURI().startsWith("/admin")) { + if (!request.getRequestURI().startsWith(request.getContextPath() + "/admin")) { filterChain.doFilter(request, servletResponse); return; } diff --git a/blog-api/src/main/java/top/naccl/config/JwtLoginFilter.java b/blog-api/src/main/java/top/naccl/config/JwtLoginFilter.java index 4e883a778..5b6562083 100644 --- a/blog-api/src/main/java/top/naccl/config/JwtLoginFilter.java +++ b/blog-api/src/main/java/top/naccl/config/JwtLoginFilter.java @@ -72,7 +72,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR response.setContentType("application/json;charset=utf-8"); User user = (User) authResult.getPrincipal(); user.setPassword(null); - Map map = new HashMap(); + Map map = new HashMap(4); map.put("user", user); map.put("token", jwt); Result result = Result.ok("登录成功", map); diff --git a/blog-api/src/main/java/top/naccl/config/RestTemplateConfig.java b/blog-api/src/main/java/top/naccl/config/RestTemplateConfig.java new file mode 100644 index 000000000..547c9e1c3 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/RestTemplateConfig.java @@ -0,0 +1,47 @@ +package top.naccl.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; +import top.naccl.config.properties.ProxyProperties; + +import java.net.InetSocketAddress; +import java.net.Proxy; + +/** + * RestTemplate相关的Bean配置 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@Configuration +public class RestTemplateConfig { + @Autowired + private ProxyProperties proxyProperties; + + /** + * 默认的RestTemplate + * + * @return + */ + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + /** + * 配置了代理和超时时间的RestTemplate + * + * @return + */ + @Bean + public RestTemplate restTemplateByProxy() { + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyProperties.getHost(), proxyProperties.getPort())); + requestFactory.setProxy(proxy); + requestFactory.setConnectTimeout(proxyProperties.getTimeout()); + return new RestTemplate(requestFactory); + } +} \ No newline at end of file diff --git a/blog-api/src/main/java/top/naccl/config/WebConfig.java b/blog-api/src/main/java/top/naccl/config/WebConfig.java index e115683b5..3c156a470 100644 --- a/blog-api/src/main/java/top/naccl/config/WebConfig.java +++ b/blog-api/src/main/java/top/naccl/config/WebConfig.java @@ -1,12 +1,12 @@ package top.naccl.config; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import top.naccl.config.properties.UploadProperties; import top.naccl.interceptor.AccessLimitInterceptor; /** @@ -18,24 +18,8 @@ public class WebConfig implements WebMvcConfigurer { @Autowired AccessLimitInterceptor accessLimitInterceptor; - private String accessPath; - private String resourcesLocations; - - /** - * @param accessPath 请求地址映射 - */ - @Value("${upload.access.path}") - public void setAccessPath(String accessPath) { - this.accessPath = accessPath; - } - - /** - * @param resourcesLocations 本地文件路径映射 - */ - @Value("${upload.resources.locations}") - public void setResourcesLocations(String resourcesLocations) { - this.resourcesLocations = resourcesLocations; - } + @Autowired + UploadProperties uploadProperties; /** * 跨域请求 @@ -68,6 +52,6 @@ public void addInterceptors(InterceptorRegistry registry) { */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler(accessPath).addResourceLocations(resourcesLocations); + registry.addResourceHandler(uploadProperties.getAccessPath()).addResourceLocations(uploadProperties.getResourcesLocations()); } } diff --git a/blog-api/src/main/java/top/naccl/config/properties/BlogProperties.java b/blog-api/src/main/java/top/naccl/config/properties/BlogProperties.java new file mode 100644 index 000000000..bef32f82f --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/properties/BlogProperties.java @@ -0,0 +1,39 @@ +package top.naccl.config.properties; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 博客配置(目前用于评论提醒模板中的超链接) + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +@Configuration +@ConfigurationProperties(prefix = "blog") +public class BlogProperties { + /** + * 博客名称 + */ + private String name; + /** + * 博客后端接口URL + */ + private String api; + /** + * 博客前端后台管理URL + */ + private String cms; + /** + * 博客前端前台页面URL + */ + private String view; +} diff --git a/blog-api/src/main/java/top/naccl/config/properties/GithubProperties.java b/blog-api/src/main/java/top/naccl/config/properties/GithubProperties.java new file mode 100644 index 000000000..2335d3f2d --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/properties/GithubProperties.java @@ -0,0 +1,39 @@ +package top.naccl.config.properties; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * GitHub配置(目前用于评论中QQ头像的图床) + * + * @author: Naccl + * @date: 2022年01月23日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +@Configuration +@ConfigurationProperties(prefix = "upload.github") +public class GithubProperties { + /** + * GitHub token + */ + private String token; + /** + * GitHub username + */ + private String username; + /** + * GitHub 仓库名 + */ + private String repos; + /** + * GitHub 仓库路径 + */ + private String reposPath; +} diff --git a/blog-api/src/main/java/top/naccl/config/properties/ProxyProperties.java b/blog-api/src/main/java/top/naccl/config/properties/ProxyProperties.java new file mode 100644 index 000000000..59b45aad0 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/properties/ProxyProperties.java @@ -0,0 +1,38 @@ +package top.naccl.config.properties; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; + +/** + * 代理配置(目前用于RestTemplate发送tg消息) + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +@Configuration +@ConfigurationProperties(prefix = "http.proxy.server") +public class ProxyProperties { + /** + * 代理服务器地址 + */ + private String host; + /** + * 代理服务器端口 + */ + private Integer port; + /** + * 连接超时(单位毫秒),通常不应该为0,0为无限超时时间,-1为系统的默认超时时间 + * + * @see SimpleClientHttpRequestFactory#setConnectTimeout(int) + */ + private Integer timeout; +} diff --git a/blog-api/src/main/java/top/naccl/config/properties/TelegramProperties.java b/blog-api/src/main/java/top/naccl/config/properties/TelegramProperties.java new file mode 100644 index 000000000..765979e2d --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/properties/TelegramProperties.java @@ -0,0 +1,48 @@ +package top.naccl.config.properties; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * Telegram配置 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +@Configuration +@ConfigurationProperties(prefix = "tg.bot") +public class TelegramProperties { + /** + * Telegram bot的api,默认是https://api.telegram.org/bot + * 如果使用自己的反代,可以修改它 + */ + private String api; + /** + * bot的token,可以从 @BotFather 处获取 + */ + private String token; + /** + * 自己账号和bot的聊天会话id + */ + private String chatId; + /** + * 是否使用代理 + */ + private Boolean useProxy; + /** + * 是否使用反向代理 + */ + private Boolean useReverseProxy; + /** + * 反向代理URL + */ + private String reverseProxyUrl; +} diff --git a/blog-api/src/main/java/top/naccl/config/properties/UploadProperties.java b/blog-api/src/main/java/top/naccl/config/properties/UploadProperties.java new file mode 100644 index 000000000..4e3136e14 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/properties/UploadProperties.java @@ -0,0 +1,35 @@ +package top.naccl.config.properties; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 静态文件上传访问路径配置(目前用于评论中QQ头像的本地存储) + * + * @author: Naccl + * @date: 2022年01月23日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +@Configuration +@ConfigurationProperties(prefix = "upload.file") +public class UploadProperties { + /** + * 本地文件路径 + */ + private String path; + /** + * 请求地址映射 + */ + private String accessPath; + /** + * 本地文件路径映射 + */ + private String resourcesLocations; +} diff --git a/blog-api/src/main/java/top/naccl/config/properties/UpyunProperties.java b/blog-api/src/main/java/top/naccl/config/properties/UpyunProperties.java new file mode 100644 index 000000000..fea529ab5 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/config/properties/UpyunProperties.java @@ -0,0 +1,43 @@ +package top.naccl.config.properties; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 又拍云配置(目前用于评论中QQ头像的图床) + * + * @author: Naccl + * @date: 2022年05月26日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +@Configuration +@ConfigurationProperties(prefix = "upload.upyun") +public class UpyunProperties { + /** + * 又拍云存储空间名称 + */ + private String bucketName; + /** + * 操作员名称 + */ + private String username; + /** + * 操作员密码 + */ + private String password; + /** + * 存储路径 + */ + private String path; + /** + * CDN访问域名 + */ + private String domain; +} diff --git a/blog-api/src/main/java/top/naccl/constant/CommentConstants.java b/blog-api/src/main/java/top/naccl/constant/CommentConstants.java new file mode 100644 index 000000000..1a3f837b3 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/constant/CommentConstants.java @@ -0,0 +1,19 @@ +package top.naccl.constant; + +/** + * 评论相关常量 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +public class CommentConstants { + /** + * 评论提醒方式-Telegram + */ + public static final String TELEGRAM = "tg"; + + /** + * 评论提醒方式-邮件 + */ + public static final String MAIL = "mail"; +} diff --git a/blog-api/src/main/java/top/naccl/constant/JwtConstants.java b/blog-api/src/main/java/top/naccl/constant/JwtConstants.java new file mode 100644 index 000000000..796068434 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/constant/JwtConstants.java @@ -0,0 +1,14 @@ +package top.naccl.constant; + +/** + * JWT常量 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +public class JwtConstants { + /** + * 博主token前缀 + */ + public static final String ADMIN_PREFIX = "admin:"; +} diff --git a/blog-api/src/main/java/top/naccl/constant/PageConstants.java b/blog-api/src/main/java/top/naccl/constant/PageConstants.java new file mode 100644 index 000000000..a788952d4 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/constant/PageConstants.java @@ -0,0 +1,22 @@ +package top.naccl.constant; + +/** + * 页面相关常量 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +public class PageConstants { + /** + * 普通博客文章页面 + */ + public static final int BLOG = 0; + /** + * 关于我页面 + */ + public static final int ABOUT = 1; + /** + * 友链页面 + */ + public static final int FRIEND = 2; +} diff --git a/blog-api/src/main/java/top/naccl/config/RedisKeyConfig.java b/blog-api/src/main/java/top/naccl/constant/RedisKeyConstants.java similarity index 54% rename from blog-api/src/main/java/top/naccl/config/RedisKeyConfig.java rename to blog-api/src/main/java/top/naccl/constant/RedisKeyConstants.java index 4b0be95c4..af39c86d3 100644 --- a/blog-api/src/main/java/top/naccl/config/RedisKeyConfig.java +++ b/blog-api/src/main/java/top/naccl/constant/RedisKeyConstants.java @@ -1,38 +1,54 @@ -package top.naccl.config; +package top.naccl.constant; /** * @Description: Redis key配置 * @Author: Naccl * @Date: 2020年09月27日 */ -public class RedisKeyConfig { - //首页博客简介列表 分页对象key:homeBlogInfoList : {{1,"第一页的缓存"},{2,"第二页的缓存"}} +public class RedisKeyConstants { + /** + * 首页博客简介列表 分页对象key + * homeBlogInfoList : {{1,"第一页的缓存"},{2,"第二页的缓存"}} + */ public static final String HOME_BLOG_INFO_LIST = "homeBlogInfoList"; - - //分类名列表key + /** + * 分类名列表key + */ public static final String CATEGORY_NAME_LIST = "categoryNameList"; - - //标签云列表key + /** + * 标签云列表key + */ public static final String TAG_CLOUD_LIST = "tagCloudList"; - - //站点信息key + /** + * 站点信息key + */ public static final String SITE_INFO_MAP = "siteInfoMap"; - - //最新推荐博客key + /** + * 最新推荐博客key + */ public static final String NEW_BLOG_LIST = "newBlogList"; - - //关于我页面key + /** + * 关于我页面key + */ public static final String ABOUT_INFO_MAP = "aboutInfoMap"; - - //友链页面信息key + /** + * 友链页面信息key + */ public static final String FRIEND_INFO_MAP = "friendInfoMap"; - - //博客归档key + /** + * 博客归档key + */ public static final String ARCHIVE_BLOG_MAP = "archiveBlogMap"; - - //博客访问量key + /** + * 博客访问量key + */ public static final String BLOG_VIEWS_MAP = "blogViewsMap"; - - //访客标识码key + /** + * 访客标识码key + */ public static final String IDENTIFICATION_SET = "identificationSet"; + /** + * QQ号与对应头像URL key + */ + public static final String QQ_AVATAR_URL_MAP = "qqAvatarUrlMap"; } diff --git a/blog-api/src/main/java/top/naccl/constant/SiteSettingConstants.java b/blog-api/src/main/java/top/naccl/constant/SiteSettingConstants.java new file mode 100644 index 000000000..fe3c79e91 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/constant/SiteSettingConstants.java @@ -0,0 +1,21 @@ +package top.naccl.constant; + +/** + * 站点设置常量 + * + * @author: Naccl + * @date: 2022年01月28日 + */ +public class SiteSettingConstants { + public static final String COPYRIGHT = "copyright"; + public static final String AVATAR = "avatar"; + public static final String NAME = "name"; + public static final String GITHUB = "github"; + public static final String TELEGRAM = "telegram"; + public static final String QQ = "qq"; + public static final String BILIBILI = "bilibili"; + public static final String NETEASE = "netease"; + public static final String EMAIL = "email"; + public static final String FAVORITE = "favorite"; + public static final String ROLL_TEXT = "rollText"; +} diff --git a/blog-api/src/main/java/top/naccl/constant/UploadConstants.java b/blog-api/src/main/java/top/naccl/constant/UploadConstants.java new file mode 100644 index 000000000..556f140de --- /dev/null +++ b/blog-api/src/main/java/top/naccl/constant/UploadConstants.java @@ -0,0 +1,26 @@ +package top.naccl.constant; + +/** + * 上传文件相关常量 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +public class UploadConstants { + /** + * 评论中QQ头像存储方式-本地 + */ + public static final String LOCAL = "local"; + /** + * 评论中QQ头像存储方式-GitHub + */ + public static final String GITHUB = "github"; + /** + * 评论中QQ头像存储方式-又拍云 + */ + public static final String UPYUN = "upyun"; + /** + * 图片ContentType + */ + public static final String IMAGE = "image"; +} diff --git a/blog-api/src/main/java/top/naccl/controller/AboutController.java b/blog-api/src/main/java/top/naccl/controller/AboutController.java index 674973eb9..2a91390da 100644 --- a/blog-api/src/main/java/top/naccl/controller/AboutController.java +++ b/blog-api/src/main/java/top/naccl/controller/AboutController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.VisitLogger; +import top.naccl.enums.VisitBehavior; import top.naccl.model.vo.Result; import top.naccl.service.AboutService; @@ -22,7 +23,7 @@ public class AboutController { * * @return */ - @VisitLogger(behavior = "访问页面", content = "关于我") + @VisitLogger(VisitBehavior.ABOUT) @GetMapping("/about") public Result about() { return Result.ok("获取成功", aboutService.getAboutInfo()); diff --git a/blog-api/src/main/java/top/naccl/controller/ArchiveController.java b/blog-api/src/main/java/top/naccl/controller/ArchiveController.java index bad64e1e9..52fa2448d 100644 --- a/blog-api/src/main/java/top/naccl/controller/ArchiveController.java +++ b/blog-api/src/main/java/top/naccl/controller/ArchiveController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.VisitLogger; +import top.naccl.enums.VisitBehavior; import top.naccl.model.vo.Result; import top.naccl.service.BlogService; @@ -24,7 +25,7 @@ public class ArchiveController { * * @return */ - @VisitLogger(behavior = "访问页面", content = "文章归档") + @VisitLogger(VisitBehavior.ARCHIVE) @GetMapping("/archives") public Result archives() { Map archiveBlogMap = blogService.getArchiveBlogAndCountByIsPublished(); diff --git a/blog-api/src/main/java/top/naccl/controller/BlogController.java b/blog-api/src/main/java/top/naccl/controller/BlogController.java index 664d00531..f284e93bf 100644 --- a/blog-api/src/main/java/top/naccl/controller/BlogController.java +++ b/blog-api/src/main/java/top/naccl/controller/BlogController.java @@ -8,7 +8,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.VisitLogger; +import top.naccl.constant.JwtConstants; import top.naccl.entity.User; +import top.naccl.enums.VisitBehavior; import top.naccl.model.dto.BlogPassword; import top.naccl.model.vo.BlogDetail; import top.naccl.model.vo.BlogInfo; @@ -40,7 +42,7 @@ public class BlogController { * @param pageNum 页码 * @return */ - @VisitLogger(behavior = "访问页面", content = "首页") + @VisitLogger(VisitBehavior.INDEX) @GetMapping("/blogs") public Result blogs(@RequestParam(defaultValue = "1") Integer pageNum) { PageResult pageResult = blogService.getBlogInfoListByIsPublished(pageNum); @@ -54,7 +56,7 @@ public Result blogs(@RequestParam(defaultValue = "1") Integer pageNum) { * @param jwt 密码保护文章的访问Token * @return */ - @VisitLogger(behavior = "查看博客") + @VisitLogger(VisitBehavior.BLOG) @GetMapping("/blog") public Result getBlog(@RequestParam Long id, @RequestHeader(value = "Authorization", defaultValue = "") String jwt) { @@ -64,13 +66,15 @@ public Result getBlog(@RequestParam Long id, if (JwtUtils.judgeTokenIsExist(jwt)) { try { String subject = JwtUtils.getTokenBody(jwt).getSubject(); - if (subject.startsWith("admin:")) {//博主身份Token - String username = subject.replace("admin:", ""); + if (subject.startsWith(JwtConstants.ADMIN_PREFIX)) { + //博主身份Token + String username = subject.replace(JwtConstants.ADMIN_PREFIX, ""); User admin = (User) userService.loadUserByUsername(username); if (admin == null) { return Result.create(403, "博主身份Token已失效,请重新登录!"); } - } else {//经密码验证后的Token + } else { + //经密码验证后的Token Long tokenBlogId = Long.parseLong(subject); //博客id不匹配,验证不通过,可能博客id改变或客户端传递了其它密码保护文章的Token if (!tokenBlogId.equals(id)) { @@ -96,7 +100,7 @@ public Result getBlog(@RequestParam Long id, * @param blogPassword 博客id、密码 * @return */ - @VisitLogger(behavior = "校验博客密码") + @VisitLogger(VisitBehavior.CHECK_PASSWORD) @PostMapping("/checkBlogPassword") public Result checkBlogPassword(@RequestBody BlogPassword blogPassword) { String password = blogService.getBlogPassword(blogPassword.getBlogId()); @@ -115,7 +119,7 @@ public Result checkBlogPassword(@RequestBody BlogPassword blogPassword) { * @param query 关键字字符串 * @return */ - @VisitLogger(behavior = "搜索博客") + @VisitLogger(VisitBehavior.SEARCH) @GetMapping("/searchBlog") public Result searchBlog(@RequestParam String query) { //校验关键字字符串合法性 diff --git a/blog-api/src/main/java/top/naccl/controller/CategoryController.java b/blog-api/src/main/java/top/naccl/controller/CategoryController.java index caaa6e014..53b7fe75c 100644 --- a/blog-api/src/main/java/top/naccl/controller/CategoryController.java +++ b/blog-api/src/main/java/top/naccl/controller/CategoryController.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.VisitLogger; +import top.naccl.enums.VisitBehavior; import top.naccl.model.vo.BlogInfo; import top.naccl.model.vo.PageResult; import top.naccl.model.vo.Result; @@ -27,7 +28,7 @@ public class CategoryController { * @param pageNum 页码 * @return */ - @VisitLogger(behavior = "查看分类") + @VisitLogger(VisitBehavior.CATEGORY) @GetMapping("/category") public Result category(@RequestParam String categoryName, @RequestParam(defaultValue = "1") Integer pageNum) { diff --git a/blog-api/src/main/java/top/naccl/controller/CommentController.java b/blog-api/src/main/java/top/naccl/controller/CommentController.java index 3d533db76..2961603c2 100644 --- a/blog-api/src/main/java/top/naccl/controller/CommentController.java +++ b/blog-api/src/main/java/top/naccl/controller/CommentController.java @@ -3,8 +3,6 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.mail.MailProperties; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -12,26 +10,20 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.AccessLimit; +import top.naccl.constant.JwtConstants; import top.naccl.entity.User; import top.naccl.model.dto.Comment; -import top.naccl.model.vo.FriendInfo; import top.naccl.model.vo.PageComment; import top.naccl.model.vo.PageResult; import top.naccl.model.vo.Result; -import top.naccl.service.AboutService; -import top.naccl.service.BlogService; import top.naccl.service.CommentService; -import top.naccl.service.FriendService; import top.naccl.service.impl.UserServiceImpl; -import top.naccl.util.HashUtils; -import top.naccl.util.IpAddressUtils; import top.naccl.util.JwtUtils; -import top.naccl.util.MailUtils; -import top.naccl.util.QQInfoUtils; import top.naccl.util.StringUtils; +import top.naccl.util.comment.CommentUtils; +import top.naccl.enums.CommentOpenStateEnum; import javax.servlet.http.HttpServletRequest; -import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -45,35 +37,9 @@ public class CommentController { @Autowired CommentService commentService; @Autowired - BlogService blogService; - @Autowired - AboutService aboutService; - @Autowired UserServiceImpl userService; @Autowired - FriendService friendService; - @Autowired - MailProperties mailProperties; - @Autowired - MailUtils mailUtils; - private String blogName; - private String cmsUrl; - private String websiteUrl; - - @Value("${custom.blog.name}") - public void setBlogName(String blogName) { - this.blogName = blogName; - } - - @Value("${custom.url.cms}") - public void setCmsUrl(String cmsUrl) { - this.cmsUrl = cmsUrl; - } - - @Value("${custom.url.website}") - public void setWebsiteUrl(String websiteUrl) { - this.websiteUrl = websiteUrl; - } + CommentUtils commentUtils; /** * 根据页面分页查询评论列表 @@ -91,44 +57,51 @@ public Result comments(@RequestParam Integer page, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, @RequestHeader(value = "Authorization", defaultValue = "") String jwt) { - int judgeResult = judgeCommentEnabled(page, blogId); - if (judgeResult == 2) { - return Result.create(404, "该博客不存在"); - } else if (judgeResult == 1) { - return Result.create(403, "评论已关闭"); - } else if (judgeResult == 3) {//文章受密码保护,需要验证Token - if (JwtUtils.judgeTokenIsExist(jwt)) { - try { - String subject = JwtUtils.getTokenBody(jwt).getSubject(); - if (subject.startsWith("admin:")) {//博主身份Token - String username = subject.replace("admin:", ""); - User admin = (User) userService.loadUserByUsername(username); - if (admin == null) { - return Result.create(403, "博主身份Token已失效,请重新登录!"); - } - } else {//经密码验证后的Token - Long tokenBlogId = Long.parseLong(subject); - //博客id不匹配,验证不通过,可能博客id改变或客户端传递了其它密码保护文章的Token - if (!tokenBlogId.equals(blogId)) { - return Result.create(403, "Token不匹配,请重新验证密码!"); + CommentOpenStateEnum openState = commentUtils.judgeCommentState(page, blogId); + switch (openState) { + case NOT_FOUND: + return Result.create(404, "该博客不存在"); + case CLOSE: + return Result.create(403, "评论已关闭"); + case PASSWORD: + //文章受密码保护,需要验证Token + if (JwtUtils.judgeTokenIsExist(jwt)) { + try { + String subject = JwtUtils.getTokenBody(jwt).getSubject(); + if (subject.startsWith(JwtConstants.ADMIN_PREFIX)) { + //博主身份Token + String username = subject.replace(JwtConstants.ADMIN_PREFIX, ""); + User admin = (User) userService.loadUserByUsername(username); + if (admin == null) { + return Result.create(403, "博主身份Token已失效,请重新登录!"); + } + } else { + //经密码验证后的Token + Long tokenBlogId = Long.parseLong(subject); + //博客id不匹配,验证不通过,可能博客id改变或客户端传递了其它密码保护文章的Token + if (!tokenBlogId.equals(blogId)) { + return Result.create(403, "Token不匹配,请重新验证密码!"); + } } + } catch (Exception e) { + e.printStackTrace(); + return Result.create(403, "Token已失效,请重新验证密码!"); } - } catch (Exception e) { - e.printStackTrace(); - return Result.create(403, "Token已失效,请重新验证密码!"); + } else { + return Result.create(403, "此文章受密码保护,请验证密码!"); } - } else { - return Result.create(403, "此文章受密码保护,请验证密码!"); - } + break; + default: + break; } //查询该页面所有评论的数量 Integer allComment = commentService.countByPageAndIsPublished(page, blogId, null); //查询该页面公开评论的数量 Integer openComment = commentService.countByPageAndIsPublished(page, blogId, true); PageHelper.startPage(pageNum, pageSize); - PageInfo pageInfo = new PageInfo(commentService.getPageCommentList(page, blogId, (long) -1)); + PageInfo pageInfo = new PageInfo(commentService.getPageCommentList(page, blogId, -1L)); PageResult pageResult = new PageResult(pageInfo.getPages(), pageInfo.getList()); - Map map = new HashMap(); + Map map = new HashMap(8); map.put("allComment", allComment); map.put("closeComment", allComment - openComment); map.put("comments", pageResult); @@ -136,43 +109,7 @@ public Result comments(@RequestParam Integer page, } /** - * 查询对应页面评论是否开启 - * - * @param page 页面分类(0普通文章,1关于我,2友链) - * @param blogId 如果page==0,需要博客id参数,校验文章是否公开状态 - * @return 0:公开可查询状态 1:评论关闭 2:该博客不存在 3:文章受密码保护 - */ - private int judgeCommentEnabled(Integer page, Long blogId) { - if (page == 0) {//普通博客 - Boolean commentEnabled = blogService.getCommentEnabledByBlogId(blogId); - Boolean published = blogService.getPublishedByBlogId(blogId); - if (commentEnabled == null || published == null) {//未查询到此博客 - return 2; - } else if (!published) {//博客未公开 - return 2; - } else if (!commentEnabled) {//博客评论已关闭 - return 1; - } - //判断文章是否存在密码 - String password = blogService.getBlogPassword(blogId); - if (!"".equals(password)) { - return 3; - } - } else if (page == 1) {//关于我页面 - if (!aboutService.getAboutCommentEnabled()) {//页面评论已关闭 - return 1; - } - } else if (page == 2) {//友链页面 - FriendInfo friendInfo = friendService.getFriendInfo(true, false); - if (!friendInfo.getCommentEnabled()) { - return 1; - } - } - return 0; - } - - /** - * 提交评论 又长又臭 能用就不改了:) https://cdn.jsdelivr.net/gh/Naccl/blog-resource/img/1stLaw4Coding.jpg + * 提交评论 又长又臭 能用就不改了:) * 单个ip,30秒内允许提交1次评论 * * @param comment 评论DTO @@ -209,254 +146,95 @@ public Result postComment(@RequestBody Comment comment, } } //判断是否可评论 - int judgeResult = judgeCommentEnabled(comment.getPage(), comment.getBlogId()); - if (judgeResult == 2) { - return Result.create(404, "该博客不存在"); - } else if (judgeResult == 1) { - return Result.create(403, "评论已关闭"); - } else if (judgeResult == 3) {//文章受密码保护 - //验证Token合法性 - if (JwtUtils.judgeTokenIsExist(jwt)) { - String subject; - try { - subject = JwtUtils.getTokenBody(jwt).getSubject(); - } catch (Exception e) { - e.printStackTrace(); - return Result.create(403, "Token已失效,请重新验证密码!"); - } - //博主评论,不受密码保护限制,根据博主信息设置评论属性 - if (subject.startsWith("admin:")) { - //Token验证通过,获取Token中用户名 - String username = subject.replace("admin:", ""); - User admin = (User) userService.loadUserByUsername(username); - if (admin == null) { - return Result.create(403, "博主身份Token已失效,请重新登录!"); - } - setAdminComment(comment, request, admin); - isVisitorComment = false; - } else {//普通访客经文章密码验证后携带Token - //对访客的评论昵称、邮箱合法性校验 - if (StringUtils.isEmpty(comment.getNickname(), comment.getEmail()) || comment.getNickname().length()> 15) { - return Result.error("参数有误"); + CommentOpenStateEnum openState = commentUtils.judgeCommentState(comment.getPage(), comment.getBlogId()); + switch (openState) { + case NOT_FOUND: + return Result.create(404, "该博客不存在"); + case CLOSE: + return Result.create(403, "评论已关闭"); + case PASSWORD: + //文章受密码保护 + //验证Token合法性 + if (JwtUtils.judgeTokenIsExist(jwt)) { + String subject; + try { + subject = JwtUtils.getTokenBody(jwt).getSubject(); + } catch (Exception e) { + e.printStackTrace(); + return Result.create(403, "Token已失效,请重新验证密码!"); } - //对于受密码保护的文章,则Token是必须的 - Long tokenBlogId = Long.parseLong(subject); - //博客id不匹配,验证不通过,可能博客id改变或客户端传递了其它密码保护文章的Token - if (!tokenBlogId.equals(comment.getBlogId())) { - return Result.create(403, "Token不匹配,请重新验证密码!"); + //博主评论,不受密码保护限制,根据博主信息设置评论属性 + if (subject.startsWith(JwtConstants.ADMIN_PREFIX)) { + //Token验证通过,获取Token中用户名 + String username = subject.replace(JwtConstants.ADMIN_PREFIX, ""); + User admin = (User) userService.loadUserByUsername(username); + if (admin == null) { + return Result.create(403, "博主身份Token已失效,请重新登录!"); + } + commentUtils.setAdminComment(comment, request, admin); + isVisitorComment = false; + } else {//普通访客经文章密码验证后携带Token + //对访客的评论昵称、邮箱合法性校验 + if (StringUtils.isEmpty(comment.getNickname(), comment.getEmail()) || comment.getNickname().length()> 15) { + return Result.error("参数有误"); + } + //对于受密码保护的文章,则Token是必须的 + Long tokenBlogId = Long.parseLong(subject); + //博客id不匹配,验证不通过,可能博客id改变或客户端传递了其它密码保护文章的Token + if (!tokenBlogId.equals(comment.getBlogId())) { + return Result.create(403, "Token不匹配,请重新验证密码!"); + } + commentUtils.setVisitorComment(comment, request); + isVisitorComment = true; } - setVisitorComment(comment, request); - isVisitorComment = true; - } - } else {//不存在Token则无评论权限 - return Result.create(403, "此文章受密码保护,请验证密码!"); - } - } else if (judgeResult == 0) {//普通文章 - //有Token则为博主评论,或文章原先为密码保护,后取消保护,但客户端仍存在Token - if (JwtUtils.judgeTokenIsExist(jwt)) { - String subject; - try { - subject = JwtUtils.getTokenBody(jwt).getSubject(); - } catch (Exception e) { - e.printStackTrace(); - return Result.create(403, "Token已失效,请重新验证密码"); + } else {//不存在Token则无评论权限 + return Result.create(403, "此文章受密码保护,请验证密码!"); } - //博主评论,根据博主信息设置评论属性 - if (subject.startsWith("admin:")) { - //Token验证通过,获取Token中用户名 - String username = subject.replace("admin:", ""); - User admin = (User) userService.loadUserByUsername(username); - if (admin == null) { - return Result.create(403, "博主身份Token已失效,请重新登录!"); + break; + case OPEN: + //评论正常开放 + //有Token则为博主评论,或文章原先为密码保护,后取消保护,但客户端仍存在Token + if (JwtUtils.judgeTokenIsExist(jwt)) { + String subject; + try { + subject = JwtUtils.getTokenBody(jwt).getSubject(); + } catch (Exception e) { + e.printStackTrace(); + return Result.create(403, "Token已失效,请重新验证密码"); } - setAdminComment(comment, request, admin); - isVisitorComment = false; - } else {//文章原先为密码保护,后取消保护,但客户端仍存在Token,则忽略Token + //博主评论,根据博主信息设置评论属性 + if (subject.startsWith(JwtConstants.ADMIN_PREFIX)) { + //Token验证通过,获取Token中用户名 + String username = subject.replace(JwtConstants.ADMIN_PREFIX, ""); + User admin = (User) userService.loadUserByUsername(username); + if (admin == null) { + return Result.create(403, "博主身份Token已失效,请重新登录!"); + } + commentUtils.setAdminComment(comment, request, admin); + isVisitorComment = false; + } else {//文章原先为密码保护,后取消保护,但客户端仍存在Token,则忽略Token + //对访客的评论昵称、邮箱合法性校验 + if (StringUtils.isEmpty(comment.getNickname(), comment.getEmail()) || comment.getNickname().length()> 15) { + return Result.error("参数有误"); + } + commentUtils.setVisitorComment(comment, request); + isVisitorComment = true; + } + } else { + //访客评论 //对访客的评论昵称、邮箱合法性校验 if (StringUtils.isEmpty(comment.getNickname(), comment.getEmail()) || comment.getNickname().length()> 15) { return Result.error("参数有误"); } - setVisitorComment(comment, request); + commentUtils.setVisitorComment(comment, request); isVisitorComment = true; } - } else {//访客评论 - //对访客的评论昵称、邮箱合法性校验 - if (StringUtils.isEmpty(comment.getNickname(), comment.getEmail()) || comment.getNickname().length()> 15) { - return Result.error("参数有误"); - } - setVisitorComment(comment, request); - isVisitorComment = true; - } + break; + default: + break; } commentService.saveComment(comment); - judgeSendMail(comment, isVisitorComment, parentComment); + commentUtils.judgeSendNotify(comment, isVisitorComment, parentComment); return Result.ok("评论成功"); } - - /** - * 设置博主评论属性 - * - * @param comment 评论DTO - * @param request 获取ip - * @param admin 博主信息 - */ - private void setAdminComment(Comment comment, HttpServletRequest request, User admin) { - comment.setAdminComment(true); - comment.setCreateTime(new Date()); - comment.setPublished(true); - comment.setAvatar(admin.getAvatar()); - comment.setWebsite("/"); - comment.setNickname(admin.getNickname()); - comment.setEmail(admin.getEmail()); - comment.setIp(IpAddressUtils.getIpAddress(request)); - comment.setNotice(false); - } - - /** - * 设置访客评论属性 - * - * @param comment 评论DTO - * @param request 用于获取ip - */ - private void setVisitorComment(Comment comment, HttpServletRequest request) { - String commentNickname = comment.getNickname(); - try { - if (QQInfoUtils.isQQNumber(commentNickname)) { - comment.setQq(commentNickname); - comment.setNickname(QQInfoUtils.getQQNickname(commentNickname)); - comment.setAvatar(QQInfoUtils.getQQAvatarURLByGithubUpload(commentNickname)); - } else { - comment.setNickname(comment.getNickname().trim()); - setCommentRandomAvatar(comment); - } - } catch (Exception e) { - e.printStackTrace(); - comment.setNickname(comment.getNickname().trim()); - setCommentRandomAvatar(comment); - } - - //set website - String website = comment.getWebsite().trim(); - if (!"".equals(website) && !website.startsWith("http://") && !website.startsWith("https://")) { - website = "http://" + website; - } - comment.setAdminComment(false); - comment.setCreateTime(new Date()); - comment.setPublished(true);//默认不需要审核 - comment.setWebsite(website); - comment.setEmail(comment.getEmail().trim()); - comment.setIp(IpAddressUtils.getIpAddress(request)); - } - - /** - * 对于昵称不是QQ号的评论,根据昵称Hash设置头像 - * - * @param comment 评论DTO - */ - private void setCommentRandomAvatar(Comment comment) { - //设置随机头像 - long nicknameHash = HashUtils.getMurmurHash32(comment.getNickname());//根据评论昵称取Hash,保证每一个昵称对应一个头像 - long num = nicknameHash % 6 + 1;//计算对应的头像 - String avatar = "/img/comment-avatar/" + num + ".jpg"; - comment.setAvatar(avatar); - } - - /** - * 判断是否发送邮件 - * 6种情况: - * 1.我以父评论提交:不用邮件提醒 - * 2.我回复我自己:不用邮件提醒 - * 3.我回复访客的评论:只提醒该访客 - * 4.访客以父评论提交:只提醒我自己 - * 5.访客回复我的评论:只提醒我自己 - * 6.访客回复访客的评论(即使是他自己先前的评论):提醒我自己和他回复的评论 - * - * @param comment 当前评论 - * @param isVisitorComment 是否访客评论 - * @param parentComment 父评论 - */ - private void judgeSendMail(Comment comment, boolean isVisitorComment, top.naccl.entity.Comment parentComment) { - if (parentComment != null && !parentComment.getAdminComment() && parentComment.getNotice()) { - //我回复访客的评论,且对方接收提醒,邮件提醒对方(3) - //访客回复访客的评论(即使是他自己先前的评论),且对方接收提醒,邮件提醒对方(6) - sendMailToParentComment(parentComment, comment); - } - if (isVisitorComment) { - //访客以父评论提交,只邮件提醒我自己(4) - //访客回复我的评论,邮件提醒我自己(5) - //访客回复访客的评论,不管对方是否接收提醒,都要提醒我有新评论(6) - sendMailToMe(comment); - } - } - - /** - * 发送邮件提醒回复对象 - * - * @param parentComment 父评论 - * @param comment 当前评论 - */ - private void sendMailToParentComment(top.naccl.entity.Comment parentComment, Comment comment) { - String path = ""; - String title = ""; - if (comment.getPage() == 0) { - //普通博客 - title = parentComment.getBlog().getTitle(); - path = "/blog/" + comment.getBlogId(); - } else if (comment.getPage() == 1) { - //关于我页面 - title = "关于我"; - path = "/about"; - } else if (comment.getPage() == 2) { - //友链页面 - title = "友人帐"; - path = "/friends"; - } - Map map = new HashMap(); - map.put("parentNickname", parentComment.getNickname()); - map.put("nickname", comment.getNickname()); - map.put("title", title); - map.put("time", comment.getCreateTime()); - map.put("parentContent", parentComment.getContent()); - map.put("content", comment.getContent()); - map.put("url", websiteUrl + path); - String toAccount = parentComment.getEmail(); - String subject = "您在 " + blogName + " 的评论有了新回复"; - mailUtils.sendHtmlTemplateMail(map, toAccount, subject, "guest.html"); - } - - /** - * 发送邮件提醒我自己 - * - * @param comment 当前评论 - */ - private void sendMailToMe(Comment comment) { - String path = ""; - String title = ""; - if (comment.getPage() == 0) { - //普通博客 - title = blogService.getTitleByBlogId(comment.getBlogId()); - path = "/blog/" + comment.getBlogId(); - } else if (comment.getPage() == 1) { - //关于我页面 - title = "关于我"; - path = "/about"; - } else if (comment.getPage() == 2) { - //友链页面 - title = "友人帐"; - path = "/friends"; - } - Map map = new HashMap(); - map.put("title", title); - map.put("time", comment.getCreateTime()); - map.put("nickname", comment.getNickname()); - map.put("content", comment.getContent()); - map.put("ip", comment.getIp()); - map.put("email", comment.getEmail()); - map.put("status", comment.getPublished() ? "公开" : "待审核"); - map.put("url", websiteUrl + path); - map.put("manageUrl", cmsUrl + "/comments"); - String toAccount = mailProperties.getUsername(); - String subject = blogName + " 收到新评论"; - mailUtils.sendHtmlTemplateMail(map, toAccount, subject, "owner.html"); - } } \ No newline at end of file diff --git a/blog-api/src/main/java/top/naccl/controller/FriendController.java b/blog-api/src/main/java/top/naccl/controller/FriendController.java index 2bf665382..f9773bf84 100644 --- a/blog-api/src/main/java/top/naccl/controller/FriendController.java +++ b/blog-api/src/main/java/top/naccl/controller/FriendController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.VisitLogger; +import top.naccl.enums.VisitBehavior; import top.naccl.model.vo.Friend; import top.naccl.model.vo.FriendInfo; import top.naccl.model.vo.Result; @@ -30,12 +31,12 @@ public class FriendController { * * @return */ - @VisitLogger(behavior = "访问页面", content = "友链") + @VisitLogger(VisitBehavior.FRIEND) @GetMapping("/friends") public Result friends() { List friendList = friendService.getFriendVOList(); FriendInfo friendInfo = friendService.getFriendInfo(true, true); - Map map = new HashMap(); + Map map = new HashMap(4); map.put("friendList", friendList); map.put("friendInfo", friendInfo); return Result.ok("获取成功", map); @@ -47,7 +48,7 @@ public Result friends() { * @param nickname 友链昵称 * @return */ - @VisitLogger(behavior = "点击友链") + @VisitLogger(VisitBehavior.CLICK_FRIEND) @PostMapping("/friend") public Result addViews(@RequestParam String nickname) { friendService.updateViewsByNickname(nickname); diff --git a/blog-api/src/main/java/top/naccl/controller/LoginController.java b/blog-api/src/main/java/top/naccl/controller/LoginController.java index 137f3c073..bf941c3fe 100644 --- a/blog-api/src/main/java/top/naccl/controller/LoginController.java +++ b/blog-api/src/main/java/top/naccl/controller/LoginController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import top.naccl.constant.JwtConstants; import top.naccl.entity.User; import top.naccl.model.dto.LoginInfo; import top.naccl.model.vo.Result; @@ -36,8 +37,8 @@ public Result login(@RequestBody LoginInfo loginInfo) { return Result.create(403, "无权限"); } user.setPassword(null); - String jwt = JwtUtils.generateToken("admin:" + user.getUsername()); - Map map = new HashMap(); + String jwt = JwtUtils.generateToken(JwtConstants.ADMIN_PREFIX + user.getUsername()); + Map map = new HashMap(4); map.put("user", user); map.put("token", jwt); return Result.ok("登录成功", map); diff --git a/blog-api/src/main/java/top/naccl/controller/MomentController.java b/blog-api/src/main/java/top/naccl/controller/MomentController.java index 3bd133505..43a22ec7e 100644 --- a/blog-api/src/main/java/top/naccl/controller/MomentController.java +++ b/blog-api/src/main/java/top/naccl/controller/MomentController.java @@ -10,8 +10,10 @@ import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.AccessLimit; import top.naccl.annotation.VisitLogger; +import top.naccl.constant.JwtConstants; import top.naccl.entity.Moment; import top.naccl.entity.User; +import top.naccl.enums.VisitBehavior; import top.naccl.model.vo.PageResult; import top.naccl.model.vo.Result; import top.naccl.service.MomentService; @@ -37,7 +39,7 @@ public class MomentController { * @param jwt 博主访问Token * @return */ - @VisitLogger(behavior = "访问页面", content = "动态") + @VisitLogger(VisitBehavior.MOMENT) @GetMapping("/moments") public Result moments(@RequestParam(defaultValue = "1") Integer pageNum, @RequestHeader(value = "Authorization", defaultValue = "") String jwt) { @@ -45,8 +47,9 @@ public Result moments(@RequestParam(defaultValue = "1") Integer pageNum, if (JwtUtils.judgeTokenIsExist(jwt)) { try { String subject = JwtUtils.getTokenBody(jwt).getSubject(); - if (subject.startsWith("admin:")) {//博主身份Token - String username = subject.replace("admin:", ""); + if (subject.startsWith(JwtConstants.ADMIN_PREFIX)) { + //博主身份Token + String username = subject.replace(JwtConstants.ADMIN_PREFIX, ""); User admin = (User) userService.loadUserByUsername(username); if (admin != null) { adminIdentity = true; @@ -69,7 +72,7 @@ public Result moments(@RequestParam(defaultValue = "1") Integer pageNum, * @return */ @AccessLimit(seconds = 86400, maxCount = 1, msg = "不可以重复点赞哦") - @VisitLogger(behavior = "点赞动态") + @VisitLogger(VisitBehavior.LIKE_MOMENT) @PostMapping("/moment/like/{id}") public Result like(@PathVariable Long id) { momentService.addLikeByMomentId(id); diff --git a/blog-api/src/main/java/top/naccl/controller/TagController.java b/blog-api/src/main/java/top/naccl/controller/TagController.java index 90626f258..83207014c 100644 --- a/blog-api/src/main/java/top/naccl/controller/TagController.java +++ b/blog-api/src/main/java/top/naccl/controller/TagController.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.naccl.annotation.VisitLogger; +import top.naccl.enums.VisitBehavior; import top.naccl.model.vo.BlogInfo; import top.naccl.model.vo.PageResult; import top.naccl.model.vo.Result; @@ -27,7 +28,7 @@ public class TagController { * @param pageNum 页码 * @return */ - @VisitLogger(behavior = "查看标签") + @VisitLogger(VisitBehavior.TAG) @GetMapping("/tag") public Result tag(@RequestParam String tagName, @RequestParam(defaultValue = "1") Integer pageNum) { diff --git a/blog-api/src/main/java/top/naccl/controller/TelegramBotController.java b/blog-api/src/main/java/top/naccl/controller/TelegramBotController.java new file mode 100644 index 000000000..d0a1d0f25 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/controller/TelegramBotController.java @@ -0,0 +1,48 @@ +package top.naccl.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import top.naccl.config.properties.TelegramProperties; +import top.naccl.constant.CommentConstants; +import top.naccl.model.dto.TgMessage; +import top.naccl.util.telegram.TelegramBotMsgHandler; + +/** + * 处理TelegramBot接收到的新消息 + * 如果不使用Telegram方式,即comment.notify.channel != tg,则该类不会被实例化,对应的Webhook接口也不会被创建 + * + * @author: Naccl + * @date: 2022年01月24日 + */ +@Slf4j +@ConditionalOnProperty(name = "comment.notify.channel", havingValue = CommentConstants.TELEGRAM) +@RestController +public class TelegramBotController { + @Autowired + private TelegramBotMsgHandler msgHandler; + @Autowired + private TelegramProperties telegramProperties; + + /** + * webhook方式监听bot收到的新消息 + * + * @param message 新消息 + */ + @PostMapping("/tg/${tg.bot.token}") + public void getUpdate(@RequestBody TgMessage message) { + log.info("Telegram bot receive message: {}", message); + //判断消息是否是自己发出的 + if (message != null && message.getMessage() != null && message.getMessage().getChat() != null + && telegramProperties.getChatId().equals(message.getMessage().getChat().getId())) { + //判断是不是正常的文本消息 + if (message.getMessage().getText() != null) { + //处理消息 + msgHandler.processCommand(message.getMessage().getText()); + } + } + } +} diff --git a/blog-api/src/main/java/top/naccl/controller/admin/AccountAdminController.java b/blog-api/src/main/java/top/naccl/controller/admin/AccountAdminController.java new file mode 100644 index 000000000..86414781b --- /dev/null +++ b/blog-api/src/main/java/top/naccl/controller/admin/AccountAdminController.java @@ -0,0 +1,32 @@ +package top.naccl.controller.admin; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import top.naccl.entity.User; +import top.naccl.model.vo.Result; +import top.naccl.service.UserService; + +/** + * @Description: 账号后台管理 + * @Author: Naccl + * @Date: 2023年01月31日 + */ +@RestController +@RequestMapping("/admin") +public class AccountAdminController { + @Autowired + UserService userService; + + /** + * 账号密码修改 + */ + @PostMapping("/account") + public Result account(@RequestBody User user, @RequestHeader(value = "Authorization", defaultValue = "") String jwt) { + boolean res = userService.changeAccount(user, jwt); + return res ? Result.ok("修改成功") : Result.error("修改失败"); + } +} diff --git a/blog-api/src/main/java/top/naccl/controller/admin/BlogAdminController.java b/blog-api/src/main/java/top/naccl/controller/admin/BlogAdminController.java index 1f7b513ad..2979afb8a 100644 --- a/blog-api/src/main/java/top/naccl/controller/admin/BlogAdminController.java +++ b/blog-api/src/main/java/top/naccl/controller/admin/BlogAdminController.java @@ -66,7 +66,7 @@ public Result blogs(@RequestParam(defaultValue = "") String title, PageHelper.startPage(pageNum, pageSize, orderBy); PageInfo pageInfo = new PageInfo(blogService.getListByTitleAndCategoryId(title, categoryId)); List categories = categoryService.getCategoryList(); - Map map = new HashMap(); + Map map = new HashMap(4); map.put("blogs", pageInfo); map.put("categories", categories); return Result.ok("请求成功", map); @@ -96,7 +96,7 @@ public Result delete(@RequestParam Long id) { public Result categoryAndTag() { List categories = categoryService.getCategoryList(); List tags = tagService.getTagList(); - Map map = new HashMap(); + Map map = new HashMap(4); map.put("categories", categories); map.put("tags", tags); return Result.ok("请求成功", map); @@ -249,7 +249,7 @@ private Result getResult(top.naccl.model.dto.Blog blog, String type) { blog.setCreateTime(date); blog.setUpdateTime(date); User user = new User(); - user.setId((long) 1);//个人博客默认只有一个作者 + user.setId(1L);//个人博客默认只有一个作者 blog.setUser(user); blogService.saveBlog(blog); diff --git a/blog-api/src/main/java/top/naccl/controller/admin/CommentAdminController.java b/blog-api/src/main/java/top/naccl/controller/admin/CommentAdminController.java index 5676459c6..80affa5ca 100644 --- a/blog-api/src/main/java/top/naccl/controller/admin/CommentAdminController.java +++ b/blog-api/src/main/java/top/naccl/controller/admin/CommentAdminController.java @@ -49,7 +49,7 @@ public Result comments(@RequestParam(defaultValue = "") Integer page, @RequestParam(defaultValue = "10") Integer pageSize) { String orderBy = "create_time desc"; PageHelper.startPage(pageNum, pageSize, orderBy); - List comments = commentService.getListByPageAndParentCommentId(page, blogId, (long) -1); + List comments = commentService.getListByPageAndParentCommentId(page, blogId, -1L); PageInfo pageInfo = new PageInfo(comments); return Result.ok("请求成功", pageInfo); } diff --git a/blog-api/src/main/java/top/naccl/controller/admin/DashboardAdminController.java b/blog-api/src/main/java/top/naccl/controller/admin/DashboardAdminController.java index f0e89ffbb..c7a02905a 100644 --- a/blog-api/src/main/java/top/naccl/controller/admin/DashboardAdminController.java +++ b/blog-api/src/main/java/top/naccl/controller/admin/DashboardAdminController.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.CityVisitor; import top.naccl.model.vo.Result; import top.naccl.service.DashboardService; @@ -30,7 +30,7 @@ public class DashboardAdminController { @GetMapping("/dashboard") public Result dashboard() { int todayPV = dashboardService.countVisitLogByToday(); - int todayUV = redisService.countBySet(RedisKeyConfig.IDENTIFICATION_SET); + int todayUV = redisService.countBySet(RedisKeyConstants.IDENTIFICATION_SET); int blogCount = dashboardService.getBlogCount(); int commentCount = dashboardService.getCommentCount(); Map categoryBlogCountMap = dashboardService.getCategoryBlogCountMap(); @@ -38,7 +38,7 @@ public Result dashboard() { Map visitRecordMap = dashboardService.getVisitRecordMap(); List cityVisitorList = dashboardService.getCityVisitorList(); - Map map = new HashMap(); + Map map = new HashMap(16); map.put("pv", todayPV); map.put("uv", todayUV); map.put("blogCount", blogCount); diff --git a/blog-api/src/main/java/top/naccl/entity/SiteSetting.java b/blog-api/src/main/java/top/naccl/entity/SiteSetting.java index 93063fed7..c3037c4bd 100644 --- a/blog-api/src/main/java/top/naccl/entity/SiteSetting.java +++ b/blog-api/src/main/java/top/naccl/entity/SiteSetting.java @@ -1,5 +1,6 @@ package top.naccl.entity; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -14,6 +15,7 @@ @Getter @Setter @ToString +@JsonIgnoreProperties(ignoreUnknown = true) public class SiteSetting { private Long id; private String nameEn; diff --git a/blog-api/src/main/java/top/naccl/enums/CommentOpenStateEnum.java b/blog-api/src/main/java/top/naccl/enums/CommentOpenStateEnum.java new file mode 100644 index 000000000..9e3c9e0ec --- /dev/null +++ b/blog-api/src/main/java/top/naccl/enums/CommentOpenStateEnum.java @@ -0,0 +1,26 @@ +package top.naccl.enums; + +/** + * 评论开放状态枚举类 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +public enum CommentOpenStateEnum { + /** + * 博客不存在,或博客未公开 + */ + NOT_FOUND, + /** + * 评论正常开放 + */ + OPEN, + /** + * 评论已关闭 + */ + CLOSE, + /** + * 评论所在页面需要密码 + */ + PASSWORD, +} diff --git a/blog-api/src/main/java/top/naccl/enums/CommentPageEnum.java b/blog-api/src/main/java/top/naccl/enums/CommentPageEnum.java new file mode 100644 index 000000000..c0bea9d75 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/enums/CommentPageEnum.java @@ -0,0 +1,40 @@ +package top.naccl.enums; + +/** + * 评论页面枚举类 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +public enum CommentPageEnum { + UNKNOWN("UNKNOWN", "UNKNOWN"), + + BLOG("", ""), + ABOUT("关于我", "/about"), + FRIEND("友人帐", "/friends"), + ; + + private String title; + private String path; + + CommentPageEnum(String title, String path) { + this.title = title; + this.path = path; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } +} diff --git a/blog-api/src/main/java/top/naccl/enums/VisitBehavior.java b/blog-api/src/main/java/top/naccl/enums/VisitBehavior.java new file mode 100644 index 000000000..e39684dcf --- /dev/null +++ b/blog-api/src/main/java/top/naccl/enums/VisitBehavior.java @@ -0,0 +1,48 @@ +package top.naccl.enums; + +/** + * 访问行为枚举类 + * + * @author: Naccl + * @date: 2022年01月08日 + */ +public enum VisitBehavior { + UNKNOWN("UNKNOWN", "UNKNOWN"), + + INDEX("访问页面", "首页"), + ARCHIVE("访问页面", "归档"), + MOMENT("访问页面", "动态"), + FRIEND("访问页面", "友链"), + ABOUT("访问页面", "关于我"), + + BLOG("查看博客", ""), + CATEGORY("查看分类", ""), + TAG("查看标签", ""), + SEARCH("搜索博客", ""), + CLICK_FRIEND("点击友链", ""), + LIKE_MOMENT("点赞动态", ""), + CHECK_PASSWORD("校验博客密码", ""), + ; + + /** + * 访问行为 + */ + private String behavior; + /** + * 访问内容 + */ + private String content; + + VisitBehavior(String behavior, String content) { + this.behavior = behavior; + this.content = content; + } + + public String getBehavior() { + return behavior; + } + + public String getContent() { + return content; + } +} diff --git a/blog-api/src/main/java/top/naccl/mapper/UserMapper.java b/blog-api/src/main/java/top/naccl/mapper/UserMapper.java index 4f2a2016e..bdae0272a 100644 --- a/blog-api/src/main/java/top/naccl/mapper/UserMapper.java +++ b/blog-api/src/main/java/top/naccl/mapper/UserMapper.java @@ -13,4 +13,8 @@ @Repository public interface UserMapper { User findByUsername(String username); + + User findById(Long id); + + int updateUserByUsername(String username, User user); } diff --git a/blog-api/src/main/java/top/naccl/model/dto/TgMessage.java b/blog-api/src/main/java/top/naccl/model/dto/TgMessage.java new file mode 100644 index 000000000..ea26d7dfd --- /dev/null +++ b/blog-api/src/main/java/top/naccl/model/dto/TgMessage.java @@ -0,0 +1,63 @@ +package top.naccl.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * Telegram新消息 + * + * @author: Naccl + * @date: 2022年01月24日 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +public class TgMessage { + @JsonProperty("update_id") + private String updateId; + private Message message; + + @NoArgsConstructor + @Getter + @Setter + @ToString + public class Message { + @JsonProperty("message_id") + private String messageId; + private From from; + private Chat chat; + private String date; + private String text; + + @NoArgsConstructor + @Getter + @Setter + @ToString + public class From { + private String id; + @JsonProperty("is_bot") + private Boolean isBot; + @JsonProperty("first_name") + private String firstName; + private String username; + @JsonProperty("language_code") + private String languageCode; + } + + @NoArgsConstructor + @Getter + @Setter + @ToString + public class Chat { + private String id; + @JsonProperty("first_name") + private String firstName; + private String username; + private String type; + } + } +} diff --git a/blog-api/src/main/java/top/naccl/model/dto/UserAgentDTO.java b/blog-api/src/main/java/top/naccl/model/dto/UserAgentDTO.java new file mode 100644 index 000000000..3c45c9b8a --- /dev/null +++ b/blog-api/src/main/java/top/naccl/model/dto/UserAgentDTO.java @@ -0,0 +1,22 @@ +package top.naccl.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @Description: UserAgent解析DTO + * @Author: Naccl + * @Date: 2022年10月13日 + */ +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@ToString +public class UserAgentDTO { + private String os; + private String browser; +} diff --git a/blog-api/src/main/java/top/naccl/model/dto/VisitLogRemark.java b/blog-api/src/main/java/top/naccl/model/dto/VisitLogRemark.java new file mode 100644 index 000000000..c1917128b --- /dev/null +++ b/blog-api/src/main/java/top/naccl/model/dto/VisitLogRemark.java @@ -0,0 +1,30 @@ +package top.naccl.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * 访问日志备注 + * + * @author: Naccl + * @date: 2022年01月08日 + */ +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@ToString +public class VisitLogRemark { + /** + * 访问内容 + */ + private String content; + + /** + * 备注 + */ + private String remark; +} diff --git a/blog-api/src/main/java/top/naccl/model/bean/Badge.java b/blog-api/src/main/java/top/naccl/model/vo/Badge.java similarity index 92% rename from blog-api/src/main/java/top/naccl/model/bean/Badge.java rename to blog-api/src/main/java/top/naccl/model/vo/Badge.java index 0b9cbedf8..4caf45e07 100644 --- a/blog-api/src/main/java/top/naccl/model/bean/Badge.java +++ b/blog-api/src/main/java/top/naccl/model/vo/Badge.java @@ -1,4 +1,4 @@ -package top.naccl.model.bean; +package top.naccl.model.vo; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/blog-api/src/main/java/top/naccl/model/bean/Copyright.java b/blog-api/src/main/java/top/naccl/model/vo/Copyright.java similarity index 90% rename from blog-api/src/main/java/top/naccl/model/bean/Copyright.java rename to blog-api/src/main/java/top/naccl/model/vo/Copyright.java index 1b6b7fa75..c0a299322 100644 --- a/blog-api/src/main/java/top/naccl/model/bean/Copyright.java +++ b/blog-api/src/main/java/top/naccl/model/vo/Copyright.java @@ -1,4 +1,4 @@ -package top.naccl.model.bean; +package top.naccl.model.vo; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/blog-api/src/main/java/top/naccl/model/bean/Favorite.java b/blog-api/src/main/java/top/naccl/model/vo/Favorite.java similarity index 90% rename from blog-api/src/main/java/top/naccl/model/bean/Favorite.java rename to blog-api/src/main/java/top/naccl/model/vo/Favorite.java index 5241b2bfb..3f05eb2ea 100644 --- a/blog-api/src/main/java/top/naccl/model/bean/Favorite.java +++ b/blog-api/src/main/java/top/naccl/model/vo/Favorite.java @@ -1,4 +1,4 @@ -package top.naccl.model.bean; +package top.naccl.model.vo; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/blog-api/src/main/java/top/naccl/model/vo/Introduction.java b/blog-api/src/main/java/top/naccl/model/vo/Introduction.java index 512e8ffb7..ebcccca63 100644 --- a/blog-api/src/main/java/top/naccl/model/vo/Introduction.java +++ b/blog-api/src/main/java/top/naccl/model/vo/Introduction.java @@ -4,7 +4,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; -import top.naccl.model.bean.Favorite; import java.util.ArrayList; import java.util.List; @@ -22,6 +21,7 @@ public class Introduction { private String avatar; private String name; private String github; + private String telegram; private String qq; private String bilibili; private String netease; diff --git a/blog-api/src/main/java/top/naccl/model/vo/QqResultVO.java b/blog-api/src/main/java/top/naccl/model/vo/QqResultVO.java new file mode 100644 index 000000000..2209510d1 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/model/vo/QqResultVO.java @@ -0,0 +1,22 @@ +package top.naccl.model.vo; + +import lombok.Data; + +import java.util.Map; + +/** + * @author raxcl + * @date 2024年01月19日 9:54:53 + */ +@Data +public class QqResultVO { + private String success; + + private String msg; + + private Map data; + + private String time; + + private String api_vers; +} diff --git a/blog-api/src/main/java/top/naccl/model/vo/QqVO.java b/blog-api/src/main/java/top/naccl/model/vo/QqVO.java new file mode 100644 index 000000000..d3e1f5c87 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/model/vo/QqVO.java @@ -0,0 +1,30 @@ +package top.naccl.model.vo; + +import lombok.Data; + +/** + * @author raxcl + * @date 2024年01月19日 9:54:53 + */ +@Data +public class QqVO { + /** + * qq号 + */ + private Long qq; + + /** + * qq昵称 + */ + private String name; + + /** + * qq邮箱 + */ + private String email; + + /** + * qq头像 + */ + private String avatar; +} diff --git a/blog-api/src/main/java/top/naccl/service/UserService.java b/blog-api/src/main/java/top/naccl/service/UserService.java index 984f61fcb..1bb5b1de8 100644 --- a/blog-api/src/main/java/top/naccl/service/UserService.java +++ b/blog-api/src/main/java/top/naccl/service/UserService.java @@ -4,4 +4,8 @@ public interface UserService { User findUserByUsernameAndPassword(String username, String password); + + User findUserById(Long id); + + boolean changeAccount(User user, String jwt); } diff --git a/blog-api/src/main/java/top/naccl/service/impl/AboutServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/AboutServiceImpl.java index 434b752de..15825ea23 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/AboutServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/AboutServiceImpl.java @@ -3,7 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.About; import top.naccl.exception.PersistenceException; import top.naccl.mapper.AboutMapper; @@ -30,13 +30,13 @@ public class AboutServiceImpl implements AboutService { @Override public Map getAboutInfo() { - String redisKey = RedisKeyConfig.ABOUT_INFO_MAP; + String redisKey = RedisKeyConstants.ABOUT_INFO_MAP; Map aboutInfoMapFromRedis = redisService.getMapByValue(redisKey); if (aboutInfoMapFromRedis != null) { return aboutInfoMapFromRedis; } List abouts = aboutMapper.getList(); - Map aboutInfoMap = new HashMap(); + Map aboutInfoMap = new HashMap(16); for (About about : abouts) { if ("content".equals(about.getNameEn())) { about.setValue(MarkdownUtils.markdownToHtmlExtensions(about.getValue())); @@ -50,7 +50,7 @@ public Map getAboutInfo() { @Override public Map getAboutSetting() { List abouts = aboutMapper.getList(); - Map map = new HashMap(); + Map map = new HashMap(16); for (About about : abouts) { map.put(about.getNameEn(), about.getValue()); } @@ -66,7 +66,7 @@ public void updateAbout(Map map) { deleteAboutRedisCache(); } - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateOneAbout(String nameEn, String value) { if (aboutMapper.updateAbout(nameEn, value) != 1) { throw new PersistenceException("修改失败"); @@ -83,6 +83,6 @@ public boolean getAboutCommentEnabled() { * 删除关于我页面缓存 */ private void deleteAboutRedisCache() { - redisService.deleteCacheByKey(RedisKeyConfig.ABOUT_INFO_MAP); + redisService.deleteCacheByKey(RedisKeyConstants.ABOUT_INFO_MAP); } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/BlogServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/BlogServiceImpl.java index 3e8a2b321..0b4f423e0 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/BlogServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/BlogServiceImpl.java @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.Blog; import top.naccl.exception.NotFoundException; import top.naccl.exception.PersistenceException; @@ -22,7 +22,6 @@ import top.naccl.service.BlogService; import top.naccl.service.RedisService; import top.naccl.service.TagService; -import top.naccl.task.RedisSyncScheduleTask; import top.naccl.util.JacksonUtils; import top.naccl.util.markdown.MarkdownUtils; @@ -45,8 +44,6 @@ public class BlogServiceImpl implements BlogService { TagService tagService; @Autowired RedisService redisService; - @Autowired - RedisSyncScheduleTask redisSyncScheduleTask; //随机博客显示5条 private static final int randomBlogLimitNum = 5; //最新推荐博客显示3条 @@ -63,7 +60,7 @@ public class BlogServiceImpl implements BlogService { */ @PostConstruct private void saveBlogViewsToRedis() { - String redisKey = RedisKeyConfig.BLOG_VIEWS_MAP; + String redisKey = RedisKeyConstants.BLOG_VIEWS_MAP; //Redis中没有存储博客浏览量的Hash if (!redisService.hasKey(redisKey)) { //从数据库中读取并存入Redis @@ -80,14 +77,16 @@ public List getListByTitleAndCategoryId(String title, Integer categoryId) @Override public List getSearchBlogListByQueryAndIsPublished(String query) { List searchBlogs = blogMapper.getSearchBlogListByQueryAndIsPublished(query); + // 数据库的处理是不区分大小写的,那么这里的匹配串处理也应该不区分大小写,否则会出现不准确的结果 + query = query.toUpperCase(); for (SearchBlog searchBlog : searchBlogs) { - String content = searchBlog.getContent(); + String content = searchBlog.getContent().toUpperCase(); int contentLength = content.length(); int index = content.indexOf(query) - 10; - index = index < 0 ? 0 : index; + index = Math.max(index, 0); int end = index + 21;//以关键字字符串为中心返回21个字 - end = end> contentLength - 1 ? contentLength - 1 : end; - searchBlog.setContent(content.substring(index, end)); + end = Math.min(end, contentLength - 1); + searchBlog.setContent(searchBlog.getContent().substring(index, end)); } return searchBlogs; } @@ -99,7 +98,7 @@ public List getIdAndTitleList() { @Override public List getNewBlogListByIsPublished() { - String redisKey = RedisKeyConfig.NEW_BLOG_LIST; + String redisKey = RedisKeyConstants.NEW_BLOG_LIST; List newBlogListFromRedis = redisService.getListByValue(redisKey); if (newBlogListFromRedis != null) { return newBlogListFromRedis; @@ -120,7 +119,7 @@ public List getNewBlogListByIsPublished() { @Override public PageResult getBlogInfoListByIsPublished(Integer pageNum) { - String redisKey = RedisKeyConfig.HOME_BLOG_INFO_LIST; + String redisKey = RedisKeyConstants.HOME_BLOG_INFO_LIST; //redis已有当前页缓存 PageResult pageResultFromRedis = redisService.getBlogInfoPageResultByHash(redisKey, pageNum); if (pageResultFromRedis != null) { @@ -144,11 +143,23 @@ public PageResult getBlogInfoListByIsPublished(Integer pageNum) { * @param pageResult */ private void setBlogViewsFromRedisToPageResult(PageResult pageResult) { - String redisKey = RedisKeyConfig.BLOG_VIEWS_MAP; + String redisKey = RedisKeyConstants.BLOG_VIEWS_MAP; List blogInfos = pageResult.getList(); for (int i = 0; i < blogInfos.size(); i++) { BlogInfo blogInfo = JacksonUtils.convertValue(blogInfos.get(i), BlogInfo.class); Long blogId = blogInfo.getId(); + /** + * 这里如果出现异常,通常是手动修改过 MySQL 而没有通过后台管理,导致 Redis 和 MySQL 不同步 + * 从 Redis 中查出了 null,强转 int 时出现 NullPointerException + * 直接抛出异常比带着 bug 继续跑要好得多 + * + * 解决步骤: + * 1.结束程序 + * 2.删除 Redis DB 中 blogViewsMap 这个 key(或者直接清空对应的整个 DB) + * 3.重新启动程序 + * + * 具体请查看: https://github.com/Naccl/NBlog/issues/58 + */ int view = (int) redisService.getValueByHashKey(redisKey, blogId); blogInfo.setViews(view); blogInfos.set(i, blogInfo); @@ -192,12 +203,11 @@ private List processBlogInfosPassword(List blogInfos) { @Override public Map getArchiveBlogAndCountByIsPublished() { - String redisKey = RedisKeyConfig.ARCHIVE_BLOG_MAP; + String redisKey = RedisKeyConstants.ARCHIVE_BLOG_MAP; Map mapFromRedis = redisService.getMapByValue(redisKey); if (mapFromRedis != null) { return mapFromRedis; } - Map map = new HashMap(); List groupYearMonth = blogMapper.getGroupYearMonthByIsPublished(); Map> archiveBlogMap = new LinkedHashMap(); for (String s : groupYearMonth) { @@ -213,6 +223,7 @@ public Map getArchiveBlogAndCountByIsPublished() { archiveBlogMap.put(s, archiveBlogs); } Integer count = countBlogByIsPublished(); + Map map = new HashMap(4); map.put("blogMap", archiveBlogMap); map.put("count", count); redisService.saveMapToValue(redisKey, map); @@ -235,24 +246,24 @@ public List getRandomBlogListByLimitNumAndIsPublishedAndIsRecommend( private Map getBlogViewsMap() { List blogViewList = blogMapper.getBlogViewsList(); - Map blogViewsMap = new HashMap(); + Map blogViewsMap = new HashMap(128); for (BlogView blogView : blogViewList) { blogViewsMap.put(blogView.getId(), blogView.getViews()); } return blogViewsMap; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteBlogById(Long id) { if (blogMapper.deleteBlogById(id) != 1) { throw new NotFoundException("该博客不存在"); } deleteBlogRedisCache(); - redisService.deleteByHashKey(RedisKeyConfig.BLOG_VIEWS_MAP, id); + redisService.deleteByHashKey(RedisKeyConstants.BLOG_VIEWS_MAP, id); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteBlogTagByBlogId(Long blogId) { if (blogMapper.deleteBlogTagByBlogId(blogId) == 0) { @@ -260,17 +271,17 @@ public void deleteBlogTagByBlogId(Long blogId) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveBlog(top.naccl.model.dto.Blog blog) { if (blogMapper.saveBlog(blog) != 1) { throw new PersistenceException("添加博客失败"); } - redisService.saveKVToHash(RedisKeyConfig.BLOG_VIEWS_MAP, blog.getId(), 0); + redisService.saveKVToHash(RedisKeyConstants.BLOG_VIEWS_MAP, blog.getId(), 0); deleteBlogRedisCache(); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveBlogTag(Long blogId, Long tagId) { if (blogMapper.saveBlogTag(blogId, tagId) != 1) { @@ -278,7 +289,7 @@ public void saveBlogTag(Long blogId, Long tagId) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateBlogRecommendById(Long blogId, Boolean recommend) { if (blogMapper.updateBlogRecommendById(blogId, recommend) != 1) { @@ -286,32 +297,32 @@ public void updateBlogRecommendById(Long blogId, Boolean recommend) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateBlogVisibilityById(Long blogId, BlogVisibility blogVisibility) { if (blogMapper.updateBlogVisibilityById(blogId, blogVisibility) != 1) { throw new PersistenceException("操作失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.HOME_BLOG_INFO_LIST); - redisService.deleteCacheByKey(RedisKeyConfig.NEW_BLOG_LIST); - redisService.deleteCacheByKey(RedisKeyConfig.ARCHIVE_BLOG_MAP); + redisService.deleteCacheByKey(RedisKeyConstants.HOME_BLOG_INFO_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.NEW_BLOG_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.ARCHIVE_BLOG_MAP); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateBlogTopById(Long blogId, Boolean top) { if (blogMapper.updateBlogTopById(blogId, top) != 1) { throw new PersistenceException("操作失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.HOME_BLOG_INFO_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.HOME_BLOG_INFO_LIST); } @Override public void updateViewsToRedis(Long blogId) { - redisService.incrementByHashKey(RedisKeyConfig.BLOG_VIEWS_MAP, blogId, 1); + redisService.incrementByHashKey(RedisKeyConstants.BLOG_VIEWS_MAP, blogId, 1); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateViews(Long blogId, Integer views) { if (blogMapper.updateViews(blogId, views) != 1) { @@ -325,8 +336,12 @@ public Blog getBlogById(Long id) { if (blog == null) { throw new NotFoundException("博客不存在"); } - //将浏览量设置为Redis中的最新值 - int view = (int) redisService.getValueByHashKey(RedisKeyConfig.BLOG_VIEWS_MAP, blog.getId()); + /** + * 将浏览量设置为Redis中的最新值 + * 这里如果出现异常,查看第 152 行注释说明 + * @see BlogServiceImpl#setBlogViewsFromRedisToPageResult + */ + int view = (int) redisService.getValueByHashKey(RedisKeyConstants.BLOG_VIEWS_MAP, blog.getId()); blog.setViews(view); return blog; } @@ -343,8 +358,12 @@ public BlogDetail getBlogByIdAndIsPublished(Long id) { throw new NotFoundException("该博客不存在"); } blog.setContent(MarkdownUtils.markdownToHtmlExtensions(blog.getContent())); - //将浏览量设置为Redis中的最新值 - int view = (int) redisService.getValueByHashKey(RedisKeyConfig.BLOG_VIEWS_MAP, blog.getId()); + /** + * 将浏览量设置为Redis中的最新值 + * 这里如果出现异常,查看第 152 行注释说明 + * @see BlogServiceImpl#setBlogViewsFromRedisToPageResult + */ + int view = (int) redisService.getValueByHashKey(RedisKeyConstants.BLOG_VIEWS_MAP, blog.getId()); blog.setViews(view); return blog; } @@ -354,14 +373,14 @@ public String getBlogPassword(Long blogId) { return blogMapper.getBlogPassword(blogId); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateBlog(top.naccl.model.dto.Blog blog) { if (blogMapper.updateBlog(blog) != 1) { throw new PersistenceException("更新博客失败"); } deleteBlogRedisCache(); - redisService.saveKVToHash(RedisKeyConfig.BLOG_VIEWS_MAP, blog.getId(), blog.getViews()); + redisService.saveKVToHash(RedisKeyConstants.BLOG_VIEWS_MAP, blog.getId(), blog.getViews()); } @Override @@ -393,8 +412,8 @@ public Boolean getPublishedByBlogId(Long blogId) { * 删除首页缓存、最新推荐缓存、归档页面缓存、博客浏览量缓存 */ private void deleteBlogRedisCache() { - redisService.deleteCacheByKey(RedisKeyConfig.HOME_BLOG_INFO_LIST); - redisService.deleteCacheByKey(RedisKeyConfig.NEW_BLOG_LIST); - redisService.deleteCacheByKey(RedisKeyConfig.ARCHIVE_BLOG_MAP); + redisService.deleteCacheByKey(RedisKeyConstants.HOME_BLOG_INFO_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.NEW_BLOG_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.ARCHIVE_BLOG_MAP); } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/CategoryServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/CategoryServiceImpl.java index 73ac12637..5b062d6d2 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/CategoryServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/CategoryServiceImpl.java @@ -3,7 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.Category; import top.naccl.exception.NotFoundException; import top.naccl.exception.PersistenceException; @@ -35,7 +35,7 @@ public List getCategoryList() { @Override public List getCategoryNameList() { - String redisKey = RedisKeyConfig.CATEGORY_NAME_LIST; + String redisKey = RedisKeyConstants.CATEGORY_NAME_LIST; List categoryListFromRedis = redisService.getListByValue(redisKey); if (categoryListFromRedis != null) { return categoryListFromRedis; @@ -45,13 +45,13 @@ public List getCategoryNameList() { return categoryList; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveCategory(Category category) { if (categoryMapper.saveCategory(category) != 1) { throw new PersistenceException("分类添加失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.CATEGORY_NAME_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.CATEGORY_NAME_LIST); } @Override @@ -68,23 +68,23 @@ public Category getCategoryByName(String name) { return categoryMapper.getCategoryByName(name); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteCategoryById(Long id) { if (categoryMapper.deleteCategoryById(id) != 1) { throw new PersistenceException("删除分类失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.CATEGORY_NAME_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.CATEGORY_NAME_LIST); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateCategory(Category category) { if (categoryMapper.updateCategory(category) != 1) { throw new PersistenceException("分类更新失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.CATEGORY_NAME_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.CATEGORY_NAME_LIST); //修改了分类名,可能有首页文章关联了分类,也要更新首页缓存 - redisService.deleteCacheByKey(RedisKeyConfig.HOME_BLOG_INFO_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.HOME_BLOG_INFO_LIST); } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/CityVisitorServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/CityVisitorServiceImpl.java index 8853b13d3..8d08f7225 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/CityVisitorServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/CityVisitorServiceImpl.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import top.naccl.entity.CityVisitor; import top.naccl.mapper.CityVisitorMapper; import top.naccl.service.CityVisitorService; @@ -16,6 +17,7 @@ public class CityVisitorServiceImpl implements CityVisitorService { @Autowired CityVisitorMapper cityVisitorMapper; + @Transactional(rollbackFor = Exception.class) @Override public void saveCityVisitor(CityVisitor cityVisitor) { cityVisitorMapper.saveCityVisitor(cityVisitor); diff --git a/blog-api/src/main/java/top/naccl/service/impl/CommentServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/CommentServiceImpl.java index 77d1051da..4d391ea2a 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/CommentServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/CommentServiceImpl.java @@ -10,6 +10,7 @@ import top.naccl.service.CommentService; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; /** @@ -39,6 +40,11 @@ public List getPageCommentList(Integer page, Long blogId, Long pare for (PageComment c : comments) { List tmpComments = new ArrayList(); getReplyComments(tmpComments, c.getReplyComments()); + //对于两列评论来说,按时间顺序排列应该比树形更合理些 + //排序一下 + Comparator comparator = Comparator.comparing(PageComment::getCreateTime); + tmpComments.sort(comparator); + c.setReplyComments(tmpComments); } return comments; @@ -57,7 +63,6 @@ public Comment getCommentById(Long id) { * 将所有子评论递归取出到一个List中 * * @param comments - * @return */ private void getReplyComments(List tmpComments, List comments) { for (PageComment c : comments) { @@ -75,15 +80,23 @@ private List getPageCommentListByPageAndParentCommentId(Integer pag return comments; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateCommentPublishedById(Long commentId, Boolean published) { + //如果是隐藏评论,则所有子评论都要修改成隐藏状态 + if (!published) { + List comments = getAllReplyComments(commentId); + for (Comment c : comments) { + hideComment(c); + } + } + if (commentMapper.updateCommentPublishedById(commentId, published) != 1) { throw new PersistenceException("操作失败"); } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateCommentNoticeById(Long commentId, Boolean notice) { if (commentMapper.updateCommentNoticeById(commentId, notice) != 1) { @@ -91,7 +104,7 @@ public void updateCommentNoticeById(Long commentId, Boolean notice) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteCommentById(Long commentId) { List comments = getAllReplyComments(commentId); @@ -103,13 +116,13 @@ public void deleteCommentById(Long commentId) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteCommentsByBlogId(Long blogId) { commentMapper.deleteCommentsByBlogId(blogId); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateComment(Comment comment) { if (commentMapper.updateComment(comment) != 1) { @@ -122,7 +135,7 @@ public int countByPageAndIsPublished(Integer page, Long blogId, Boolean isPublis return commentMapper.countByPageAndIsPublished(page, blogId, isPublished); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveComment(top.naccl.model.dto.Comment comment) { if (commentMapper.saveComment(comment) != 1) { @@ -134,7 +147,6 @@ public void saveComment(top.naccl.model.dto.Comment comment) { * 递归删除子评论 * * @param comment 需要删除子评论的父评论 - * @return */ private void delete(Comment comment) { for (Comment c : comment.getReplyComments()) { @@ -145,6 +157,20 @@ private void delete(Comment comment) { } } + /** + * 递归隐藏子评论 + * + * @param comment 需要隐藏子评论的父评论 + */ + private void hideComment(Comment comment) { + for (Comment c : comment.getReplyComments()) { + hideComment(c); + } + if (commentMapper.updateCommentPublishedById(comment.getId(), false) != 1) { + throw new PersistenceException("操作失败"); + } + } + /** * 按id递归查询子评论 * diff --git a/blog-api/src/main/java/top/naccl/service/impl/DashboardServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/DashboardServiceImpl.java index bc1248ea5..02f166ffc 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/DashboardServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/DashboardServiceImpl.java @@ -75,7 +75,7 @@ public Map getCategoryBlogCountMap() { //分类对应的博客数量List List series = new ArrayList(); if (categoryBlogCountList.size() == categoryList.size()) { - Map m = new HashMap(); + Map m = new HashMap(16); for (Category c : categoryList) { m.put(c.getId(), c.getName()); } @@ -84,7 +84,7 @@ public Map getCategoryBlogCountMap() { series.add(c); } } else { - Map m = new HashMap(); + Map m = new HashMap(16); for (CategoryBlogCount c : categoryBlogCountList) { m.put(c.getId(), c.getValue()); } @@ -100,7 +100,7 @@ public Map getCategoryBlogCountMap() { series.add(categoryBlogCount); } } - Map map = new HashMap(); + Map map = new HashMap(4); map.put("legend", legend); map.put("series", series); return map; @@ -120,7 +120,7 @@ public Map getTagBlogCountMap() { //标签对应的博客数量List List series = new ArrayList(); if (tagBlogCountList.size() == tagList.size()) { - Map m = new HashMap(); + Map m = new HashMap(64); for (Tag t : tagList) { m.put(t.getId(), t.getName()); } @@ -129,7 +129,7 @@ public Map getTagBlogCountMap() { series.add(t); } } else { - Map m = new HashMap(); + Map m = new HashMap(64); for (TagBlogCount t : tagBlogCountList) { m.put(t.getId(), t.getValue()); } @@ -145,7 +145,7 @@ public Map getTagBlogCountMap() { series.add(tagBlogCount); } } - Map map = new HashMap(); + Map map = new HashMap(4); map.put("legend", legend); map.put("series", series); return map; @@ -163,7 +163,7 @@ public Map getVisitRecordMap() { pv.add(visitRecord.getPv()); uv.add(visitRecord.getUv()); } - Map map = new HashMap(); + Map map = new HashMap(8); map.put("date", date); map.put("pv", pv); map.put("uv", uv); diff --git a/blog-api/src/main/java/top/naccl/service/impl/ExceptionLogServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/ExceptionLogServiceImpl.java index c2563df18..cce30c4ec 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/ExceptionLogServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/ExceptionLogServiceImpl.java @@ -6,12 +6,12 @@ import top.naccl.entity.ExceptionLog; import top.naccl.exception.PersistenceException; import top.naccl.mapper.ExceptionLogMapper; +import top.naccl.model.dto.UserAgentDTO; import top.naccl.service.ExceptionLogService; import top.naccl.util.IpAddressUtils; import top.naccl.util.UserAgentUtils; import java.util.List; -import java.util.Map; /** * @Description: 异常日志业务层实现 @@ -30,22 +30,20 @@ public List getExceptionLogListByDate(String startDate, String end return exceptionLogMapper.getExceptionLogListByDate(startDate, endDate); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveExceptionLog(ExceptionLog log) { String ipSource = IpAddressUtils.getCityInfo(log.getIp()); - Map userAgentMap = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); - String os = userAgentMap.get("os"); - String browser = userAgentMap.get("browser"); + UserAgentDTO userAgentDTO = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); log.setIpSource(ipSource); - log.setOs(os); - log.setBrowser(browser); + log.setOs(userAgentDTO.getOs()); + log.setBrowser(userAgentDTO.getBrowser()); if (exceptionLogMapper.saveExceptionLog(log) != 1) { throw new PersistenceException("日志添加失败"); } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteExceptionLogById(Long id) { if (exceptionLogMapper.deleteExceptionLogById(id) != 1) { diff --git a/blog-api/src/main/java/top/naccl/service/impl/FriendServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/FriendServiceImpl.java index 1ef24498c..70b976a13 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/FriendServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/FriendServiceImpl.java @@ -3,7 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.Friend; import top.naccl.entity.SiteSetting; import top.naccl.exception.PersistenceException; @@ -41,7 +41,7 @@ public List getFriendVOList() { return friendMapper.getFriendVOList(); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateFriendPublishedById(Long friendId, Boolean published) { if (friendMapper.updateFriendPublishedById(friendId, published) != 1) { @@ -49,7 +49,7 @@ public void updateFriendPublishedById(Long friendId, Boolean published) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveFriend(Friend friend) { friend.setViews(0); @@ -59,7 +59,7 @@ public void saveFriend(Friend friend) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateFriend(top.naccl.model.dto.Friend friend) { if (friendMapper.updateFriend(friend) != 1) { @@ -67,7 +67,7 @@ public void updateFriend(top.naccl.model.dto.Friend friend) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteFriend(Long id) { if (friendMapper.deleteFriend(id) != 1) { @@ -75,7 +75,7 @@ public void deleteFriend(Long id) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateViewsByNickname(String nickname) { if (friendMapper.updateViewsByNickname(nickname) != 1) { @@ -85,7 +85,7 @@ public void updateViewsByNickname(String nickname) { @Override public FriendInfo getFriendInfo(boolean cache, boolean md) { - String redisKey = RedisKeyConfig.FRIEND_INFO_MAP; + String redisKey = RedisKeyConstants.FRIEND_INFO_MAP; if (cache) { FriendInfo friendInfoFromRedis = redisService.getObjectByValue(redisKey, FriendInfo.class); if (friendInfoFromRedis != null) { @@ -115,7 +115,7 @@ public FriendInfo getFriendInfo(boolean cache, boolean md) { return friendInfo; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateFriendInfoContent(String content) { if (siteSettingMapper.updateFriendInfoContent(content) != 1) { @@ -124,7 +124,7 @@ public void updateFriendInfoContent(String content) { deleteFriendInfoRedisCache(); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateFriendInfoCommentEnabled(Boolean commentEnabled) { if (siteSettingMapper.updateFriendInfoCommentEnabled(commentEnabled) != 1) { @@ -137,6 +137,6 @@ public void updateFriendInfoCommentEnabled(Boolean commentEnabled) { * 删除友链页面缓存 */ private void deleteFriendInfoRedisCache() { - redisService.deleteCacheByKey(RedisKeyConfig.FRIEND_INFO_MAP); + redisService.deleteCacheByKey(RedisKeyConstants.FRIEND_INFO_MAP); } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/LoginLogServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/LoginLogServiceImpl.java index 7eec8c51d..6f0add9dc 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/LoginLogServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/LoginLogServiceImpl.java @@ -6,12 +6,12 @@ import top.naccl.entity.LoginLog; import top.naccl.exception.PersistenceException; import top.naccl.mapper.LoginLogMapper; +import top.naccl.model.dto.UserAgentDTO; import top.naccl.service.LoginLogService; import top.naccl.util.IpAddressUtils; import top.naccl.util.UserAgentUtils; import java.util.List; -import java.util.Map; /** * @Description: 登录日志业务层实现 @@ -30,22 +30,20 @@ public List getLoginLogListByDate(String startDate, String endDate) { return loginLogMapper.getLoginLogListByDate(startDate, endDate); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveLoginLog(LoginLog log) { String ipSource = IpAddressUtils.getCityInfo(log.getIp()); - Map userAgentMap = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); - String os = userAgentMap.get("os"); - String browser = userAgentMap.get("browser"); + UserAgentDTO userAgentDTO = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); log.setIpSource(ipSource); - log.setOs(os); - log.setBrowser(browser); + log.setOs(userAgentDTO.getOs()); + log.setBrowser(userAgentDTO.getBrowser()); if (loginLogMapper.saveLoginLog(log) != 1) { throw new PersistenceException("日志添加失败"); } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteLoginLogById(Long id) { if (loginLogMapper.deleteLoginLogById(id) != 1) { diff --git a/blog-api/src/main/java/top/naccl/service/impl/MomentServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/MomentServiceImpl.java index 1451bc556..8960965b4 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/MomentServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/MomentServiceImpl.java @@ -48,7 +48,7 @@ public List getMomentVOList(Integer pageNum, boolean adminIdentity) { return moments; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void addLikeByMomentId(Long momentId) { if (momentMapper.addLikeByMomentId(momentId) != 1) { @@ -56,7 +56,7 @@ public void addLikeByMomentId(Long momentId) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateMomentPublishedById(Long momentId, Boolean published) { if (momentMapper.updateMomentPublishedById(momentId, published) != 1) { @@ -73,7 +73,7 @@ public Moment getMomentById(Long id) { return moment; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteMomentById(Long id) { if (momentMapper.deleteMomentById(id) != 1) { @@ -81,7 +81,7 @@ public void deleteMomentById(Long id) { } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveMoment(Moment moment) { if (momentMapper.saveMoment(moment) != 1) { @@ -89,6 +89,7 @@ public void saveMoment(Moment moment) { } } + @Transactional(rollbackFor = Exception.class) @Override public void updateMoment(Moment moment) { if (momentMapper.updateMoment(moment) != 1) { diff --git a/blog-api/src/main/java/top/naccl/service/impl/OperationLogServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/OperationLogServiceImpl.java index 55bbb6248..6916a4955 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/OperationLogServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/OperationLogServiceImpl.java @@ -6,12 +6,12 @@ import top.naccl.entity.OperationLog; import top.naccl.exception.PersistenceException; import top.naccl.mapper.OperationLogMapper; +import top.naccl.model.dto.UserAgentDTO; import top.naccl.service.OperationLogService; import top.naccl.util.IpAddressUtils; import top.naccl.util.UserAgentUtils; import java.util.List; -import java.util.Map; /** * @Description: 操作日志业务层实现 @@ -30,22 +30,20 @@ public List getOperationLogListByDate(String startDate, String end return operationLogMapper.getOperationLogListByDate(startDate, endDate); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveOperationLog(OperationLog log) { String ipSource = IpAddressUtils.getCityInfo(log.getIp()); - Map userAgentMap = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); - String os = userAgentMap.get("os"); - String browser = userAgentMap.get("browser"); + UserAgentDTO userAgentDTO = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); log.setIpSource(ipSource); - log.setOs(os); - log.setBrowser(browser); + log.setOs(userAgentDTO.getOs()); + log.setBrowser(userAgentDTO.getBrowser()); if (operationLogMapper.saveOperationLog(log) != 1) { throw new PersistenceException("日志添加失败"); } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteOperationLogById(Long id) { if (operationLogMapper.deleteOperationLogById(id) != 1) { diff --git a/blog-api/src/main/java/top/naccl/service/impl/ScheduleJobServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/ScheduleJobServiceImpl.java index 1026e6827..c80ee8ebb 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/ScheduleJobServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/ScheduleJobServiceImpl.java @@ -52,8 +52,8 @@ public List getJobList() { return schedulerJobMapper.getJobList(); } + @Transactional(rollbackFor = Exception.class) @Override - @Transactional public void saveJob(ScheduleJob scheduleJob) { if (schedulerJobMapper.saveJob(scheduleJob) != 1) { throw new PersistenceException("添加失败"); @@ -61,8 +61,8 @@ public void saveJob(ScheduleJob scheduleJob) { ScheduleUtils.createScheduleJob(scheduler, scheduleJob); } + @Transactional(rollbackFor = Exception.class) @Override - @Transactional public void updateJob(ScheduleJob scheduleJob) { if (schedulerJobMapper.updateJob(scheduleJob) != 1) { throw new PersistenceException("更新失败"); @@ -70,8 +70,8 @@ public void updateJob(ScheduleJob scheduleJob) { ScheduleUtils.updateScheduleJob(scheduler, scheduleJob); } + @Transactional(rollbackFor = Exception.class) @Override - @Transactional public void deleteJobById(Long jobId) { ScheduleUtils.deleteScheduleJob(scheduler, jobId); if (schedulerJobMapper.deleteJobById(jobId) != 1) { @@ -84,8 +84,8 @@ public void runJobById(Long jobId) { ScheduleUtils.run(scheduler, schedulerJobMapper.getJobById(jobId)); } + @Transactional(rollbackFor = Exception.class) @Override - @Transactional public void updateJobStatusById(Long jobId, Boolean status) { if (status) { ScheduleUtils.resumeJob(scheduler, jobId); @@ -102,15 +102,15 @@ public List getJobLogListByDate(String startDate, String endDate return scheduleJobLogMapper.getJobLogListByDate(startDate, endDate); } + @Transactional(rollbackFor = Exception.class) @Override - @Transactional public void saveJobLog(ScheduleJobLog jobLog) { if (scheduleJobLogMapper.saveJobLog(jobLog) != 1) { throw new PersistenceException("日志添加失败"); } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteJobLogByLogId(Long logId) { if (scheduleJobLogMapper.deleteJobLogByLogId(logId) != 1) { diff --git a/blog-api/src/main/java/top/naccl/service/impl/SiteSettingServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/SiteSettingServiceImpl.java index 2342a1b18..ec0003644 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/SiteSettingServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/SiteSettingServiceImpl.java @@ -3,13 +3,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; +import top.naccl.constant.SiteSettingConstants; import top.naccl.entity.SiteSetting; import top.naccl.exception.PersistenceException; import top.naccl.mapper.SiteSettingMapper; -import top.naccl.model.bean.Badge; -import top.naccl.model.bean.Copyright; -import top.naccl.model.bean.Favorite; +import top.naccl.model.vo.Badge; +import top.naccl.model.vo.Copyright; +import top.naccl.model.vo.Favorite; import top.naccl.model.vo.Introduction; import top.naccl.service.RedisService; import top.naccl.service.SiteSettingService; @@ -40,19 +41,25 @@ public class SiteSettingServiceImpl implements SiteSettingService { @Override public Map> getList() { List siteSettings = siteSettingMapper.getList(); - Map> map = new HashMap(); List type1 = new ArrayList(); List type2 = new ArrayList(); List type3 = new ArrayList(); for (SiteSetting s : siteSettings) { - if (s.getType() == 1) { - type1.add(s); - } else if (s.getType() == 2) { - type2.add(s); - } else if (s.getType() == 3) { - type3.add(s); + switch (s.getType()) { + case 1: + type1.add(s); + break; + case 2: + type2.add(s); + break; + case 3: + type3.add(s); + break; + default: + break; } } + Map> map = new HashMap(8); map.put("type1", type1); map.put("type2", type2); map.put("type3", type3); @@ -61,57 +68,78 @@ public Map> getList() { @Override public Map getSiteInfo() { - String redisKey = RedisKeyConfig.SITE_INFO_MAP; + String redisKey = RedisKeyConstants.SITE_INFO_MAP; Map siteInfoMapFromRedis = redisService.getMapByValue(redisKey); if (siteInfoMapFromRedis != null) { return siteInfoMapFromRedis; } List siteSettings = siteSettingMapper.getList(); - Map map = new HashMap(); - Map siteInfo = new HashMap(); + Map siteInfo = new HashMap(2); List badges = new ArrayList(); Introduction introduction = new Introduction(); List favorites = new ArrayList(); List rollTexts = new ArrayList(); for (SiteSetting s : siteSettings) { - if (s.getType() == 1) { - if ("copyright".equals(s.getNameEn())) { - Copyright copyright = JacksonUtils.readValue(s.getValue(), Copyright.class); - siteInfo.put(s.getNameEn(), copyright); - } else { - siteInfo.put(s.getNameEn(), s.getValue()); - } - } else if (s.getType() == 2) { - Badge badge = JacksonUtils.readValue(s.getValue(), Badge.class); - badges.add(badge); - } else if (s.getType() == 3) { - if ("avatar".equals(s.getNameEn())) { - introduction.setAvatar(s.getValue()); - } else if ("name".equals(s.getNameEn())) { - introduction.setName(s.getValue()); - } else if ("github".equals(s.getNameEn())) { - introduction.setGithub(s.getValue()); - } else if ("qq".equals(s.getNameEn())) { - introduction.setQq(s.getValue()); - } else if ("bilibili".equals(s.getNameEn())) { - introduction.setBilibili(s.getValue()); - } else if ("netease".equals(s.getNameEn())) { - introduction.setNetease(s.getValue()); - } else if ("email".equals(s.getNameEn())) { - introduction.setEmail(s.getValue()); - } else if ("favorite".equals(s.getNameEn())) { - Favorite favorite = JacksonUtils.readValue(s.getValue(), Favorite.class); - favorites.add(favorite); - } else if ("rollText".equals(s.getNameEn())) { - Matcher m = PATTERN.matcher(s.getValue()); - while (m.find()) { - rollTexts.add(m.group(1)); + switch (s.getType()) { + case 1: + if (SiteSettingConstants.COPYRIGHT.equals(s.getNameEn())) { + Copyright copyright = JacksonUtils.readValue(s.getValue(), Copyright.class); + siteInfo.put(s.getNameEn(), copyright); + } else { + siteInfo.put(s.getNameEn(), s.getValue()); } - } + break; + case 2: + switch (s.getNameEn()) { + case SiteSettingConstants.AVATAR: + introduction.setAvatar(s.getValue()); + break; + case SiteSettingConstants.NAME: + introduction.setName(s.getValue()); + break; + case SiteSettingConstants.GITHUB: + introduction.setGithub(s.getValue()); + break; + case SiteSettingConstants.TELEGRAM: + introduction.setTelegram(s.getValue()); + break; + case SiteSettingConstants.QQ: + introduction.setQq(s.getValue()); + break; + case SiteSettingConstants.BILIBILI: + introduction.setBilibili(s.getValue()); + break; + case SiteSettingConstants.NETEASE: + introduction.setNetease(s.getValue()); + break; + case SiteSettingConstants.EMAIL: + introduction.setEmail(s.getValue()); + break; + case SiteSettingConstants.FAVORITE: + Favorite favorite = JacksonUtils.readValue(s.getValue(), Favorite.class); + favorites.add(favorite); + break; + case SiteSettingConstants.ROLL_TEXT: + Matcher m = PATTERN.matcher(s.getValue()); + while (m.find()) { + rollTexts.add(m.group(1)); + } + break; + default: + break; + } + break; + case 3: + Badge badge = JacksonUtils.readValue(s.getValue(), Badge.class); + badges.add(badge); + break; + default: + break; } } introduction.setFavorites(favorites); introduction.setRollText(rollTexts); + Map map = new HashMap(8); map.put("introduction", introduction); map.put("siteInfo", siteInfo); map.put("badges", badges); @@ -124,37 +152,38 @@ public String getWebTitleSuffix() { return siteSettingMapper.getWebTitleSuffix(); } + @Transactional(rollbackFor = Exception.class) @Override public void updateSiteSetting(List siteSettings, List deleteIds) { - for (Integer id : deleteIds) {//删除 + for (Integer id : deleteIds) { + //删除 deleteOneSiteSettingById(id); } for (LinkedHashMap s : siteSettings) { SiteSetting siteSetting = JacksonUtils.convertValue(s, SiteSetting.class); - if (siteSetting.getId() != null) {//修改 + if (siteSetting.getId() != null) { + //修改 updateOneSiteSetting(siteSetting); - } else {//添加 + } else { + //添加 saveOneSiteSetting(siteSetting); } } deleteSiteInfoRedisCache(); } - @Transactional public void saveOneSiteSetting(SiteSetting siteSetting) { if (siteSettingMapper.saveSiteSetting(siteSetting) != 1) { throw new PersistenceException("配置添加失败"); } } - @Transactional public void updateOneSiteSetting(SiteSetting siteSetting) { if (siteSettingMapper.updateSiteSetting(siteSetting) != 1) { throw new PersistenceException("配置修改失败"); } } - @Transactional public void deleteOneSiteSettingById(Integer id) { if (siteSettingMapper.deleteSiteSettingById(id) != 1) { throw new PersistenceException("配置删除失败"); @@ -165,6 +194,6 @@ public void deleteOneSiteSettingById(Integer id) { * 删除站点信息缓存 */ private void deleteSiteInfoRedisCache() { - redisService.deleteCacheByKey(RedisKeyConfig.SITE_INFO_MAP); + redisService.deleteCacheByKey(RedisKeyConstants.SITE_INFO_MAP); } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/TagServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/TagServiceImpl.java index 3d6d86b97..1dafdf7dc 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/TagServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/TagServiceImpl.java @@ -3,7 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.Tag; import top.naccl.exception.NotFoundException; import top.naccl.exception.PersistenceException; @@ -32,7 +32,7 @@ public List getTagList() { @Override public List getTagListNotId() { - String redisKey = RedisKeyConfig.TAG_CLOUD_LIST; + String redisKey = RedisKeyConstants.TAG_CLOUD_LIST; List tagListFromRedis = redisService.getListByValue(redisKey); if (tagListFromRedis != null) { return tagListFromRedis; @@ -47,13 +47,13 @@ public List getTagListByBlogId(Long blogId) { return tagMapper.getTagListByBlogId(blogId); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveTag(Tag tag) { if (tagMapper.saveTag(tag) != 1) { throw new PersistenceException("标签添加失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.TAG_CLOUD_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.TAG_CLOUD_LIST); } @Override @@ -70,23 +70,23 @@ public Tag getTagByName(String name) { return tagMapper.getTagByName(name); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteTagById(Long id) { if (tagMapper.deleteTagById(id) != 1) { throw new PersistenceException("标签删除失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.TAG_CLOUD_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.TAG_CLOUD_LIST); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void updateTag(Tag tag) { if (tagMapper.updateTag(tag) != 1) { throw new PersistenceException("标签更新失败"); } - redisService.deleteCacheByKey(RedisKeyConfig.TAG_CLOUD_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.TAG_CLOUD_LIST); //修改了标签名或颜色,可能有首页文章关联了标签,也要更新首页缓存 - redisService.deleteCacheByKey(RedisKeyConfig.HOME_BLOG_INFO_LIST); + redisService.deleteCacheByKey(RedisKeyConstants.HOME_BLOG_INFO_LIST); } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/UserServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/UserServiceImpl.java index d6c31a557..17f04a4d8 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/UserServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/UserServiceImpl.java @@ -5,10 +5,13 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -import top.naccl.mapper.UserMapper; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import top.naccl.entity.User; +import top.naccl.exception.NotFoundException; +import top.naccl.mapper.UserMapper; import top.naccl.service.UserService; import top.naccl.util.HashUtils; +import top.naccl.util.JwtUtils; /** * @Description: 用户业务层接口实现类 @@ -40,4 +43,24 @@ public User findUserByUsernameAndPassword(String username, String password) { } return user; } + + @Override + public User findUserById(Long id) { + User user = userMapper.findById(id); + if (user == null) { + throw new NotFoundException("用户不存在"); + } + return user; + } + + @Override + public boolean changeAccount(User user, String jwt) { + String username = JwtUtils.getTokenBody(jwt).getSubject(); + user.setPassword(HashUtils.getBC(user.getPassword())); + if (userMapper.updateUserByUsername(username, user) != 1) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return false; + } + return true; + } } diff --git a/blog-api/src/main/java/top/naccl/service/impl/VisitLogServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/VisitLogServiceImpl.java index 47735e2c4..bf8a56133 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/VisitLogServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/VisitLogServiceImpl.java @@ -6,13 +6,13 @@ import top.naccl.entity.VisitLog; import top.naccl.exception.PersistenceException; import top.naccl.mapper.VisitLogMapper; +import top.naccl.model.dto.UserAgentDTO; import top.naccl.model.dto.VisitLogUuidTime; import top.naccl.service.VisitLogService; import top.naccl.util.IpAddressUtils; import top.naccl.util.UserAgentUtils; import java.util.List; -import java.util.Map; /** * @Description: 访问日志业务层实现 @@ -36,22 +36,20 @@ public List getUUIDAndCreateTimeByYesterday() { return visitLogMapper.getUUIDAndCreateTimeByYesterday(); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveVisitLog(VisitLog log) { String ipSource = IpAddressUtils.getCityInfo(log.getIp()); - Map userAgentMap = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); - String os = userAgentMap.get("os"); - String browser = userAgentMap.get("browser"); + UserAgentDTO userAgentDTO = userAgentUtils.parseOsAndBrowser(log.getUserAgent()); log.setIpSource(ipSource); - log.setOs(os); - log.setBrowser(browser); + log.setOs(userAgentDTO.getOs()); + log.setBrowser(userAgentDTO.getBrowser()); if (visitLogMapper.saveVisitLog(log) != 1) { throw new PersistenceException("日志添加失败"); } } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteVisitLogById(Long id) { if (visitLogMapper.deleteVisitLogById(id) != 1) { diff --git a/blog-api/src/main/java/top/naccl/service/impl/VisitRecordServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/VisitRecordServiceImpl.java index 250412e11..5cc588431 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/VisitRecordServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/VisitRecordServiceImpl.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import top.naccl.entity.VisitRecord; import top.naccl.mapper.VisitRecordMapper; import top.naccl.service.VisitRecordService; @@ -16,6 +17,7 @@ public class VisitRecordServiceImpl implements VisitRecordService { @Autowired VisitRecordMapper visitRecordMapper; + @Transactional(rollbackFor = Exception.class) @Override public void saveVisitRecord(VisitRecord visitRecord) { visitRecordMapper.saveVisitRecord(visitRecord); diff --git a/blog-api/src/main/java/top/naccl/service/impl/VisitorServiceImpl.java b/blog-api/src/main/java/top/naccl/service/impl/VisitorServiceImpl.java index 1ac77a343..3b532666a 100644 --- a/blog-api/src/main/java/top/naccl/service/impl/VisitorServiceImpl.java +++ b/blog-api/src/main/java/top/naccl/service/impl/VisitorServiceImpl.java @@ -3,10 +3,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.Visitor; import top.naccl.exception.PersistenceException; import top.naccl.mapper.VisitorMapper; +import top.naccl.model.dto.UserAgentDTO; import top.naccl.model.dto.VisitLogUuidTime; import top.naccl.service.RedisService; import top.naccl.service.VisitorService; @@ -14,7 +15,6 @@ import top.naccl.util.UserAgentUtils; import java.util.List; -import java.util.Map; /** * @Description: 访客统计业务层实现 @@ -42,34 +42,33 @@ public List getNewVisitorIpSourceByYesterday() { @Override public boolean hasUUID(String uuid) { - return visitorMapper.hasUUID(uuid) == 0 ? false : true; + return visitorMapper.hasUUID(uuid) != 0; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void saveVisitor(Visitor visitor) { String ipSource = IpAddressUtils.getCityInfo(visitor.getIp()); - Map userAgentMap = userAgentUtils.parseOsAndBrowser(visitor.getUserAgent()); - String os = userAgentMap.get("os"); - String browser = userAgentMap.get("browser"); + UserAgentDTO userAgentDTO = userAgentUtils.parseOsAndBrowser(visitor.getUserAgent()); visitor.setIpSource(ipSource); - visitor.setOs(os); - visitor.setBrowser(browser); + visitor.setOs(userAgentDTO.getOs()); + visitor.setBrowser(userAgentDTO.getBrowser()); if (visitorMapper.saveVisitor(visitor) != 1) { throw new PersistenceException("访客添加失败"); } } + @Transactional(rollbackFor = Exception.class) @Override public void updatePVAndLastTimeByUUID(VisitLogUuidTime dto) { visitorMapper.updatePVAndLastTimeByUUID(dto); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void deleteVisitor(Long id, String uuid) { //删除Redis中该访客的uuid - redisService.deleteValueBySet(RedisKeyConfig.IDENTIFICATION_SET, uuid); + redisService.deleteValueBySet(RedisKeyConstants.IDENTIFICATION_SET, uuid); if (visitorMapper.deleteVisitorById(id) != 1) { throw new PersistenceException("删除访客失败"); } diff --git a/blog-api/src/main/java/top/naccl/task/RedisSyncScheduleTask.java b/blog-api/src/main/java/top/naccl/task/RedisSyncScheduleTask.java index 37611f1cf..bb3e89a43 100644 --- a/blog-api/src/main/java/top/naccl/task/RedisSyncScheduleTask.java +++ b/blog-api/src/main/java/top/naccl/task/RedisSyncScheduleTask.java @@ -2,7 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.service.BlogService; import top.naccl.service.RedisService; @@ -25,7 +25,7 @@ public class RedisSyncScheduleTask { * 从Redis同步博客文章浏览量到数据库 */ public void syncBlogViewsToDatabase() { - String redisKey = RedisKeyConfig.BLOG_VIEWS_MAP; + String redisKey = RedisKeyConstants.BLOG_VIEWS_MAP; Map blogViewsMap = redisService.getMapByHash(redisKey); Set keys = blogViewsMap.keySet(); for (Integer key : keys) { diff --git a/blog-api/src/main/java/top/naccl/task/VisitorSyncScheduleTask.java b/blog-api/src/main/java/top/naccl/task/VisitorSyncScheduleTask.java index e3ecc7255..d6fab2591 100644 --- a/blog-api/src/main/java/top/naccl/task/VisitorSyncScheduleTask.java +++ b/blog-api/src/main/java/top/naccl/task/VisitorSyncScheduleTask.java @@ -3,7 +3,7 @@ import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import top.naccl.config.RedisKeyConfig; +import top.naccl.constant.RedisKeyConstants; import top.naccl.entity.CityVisitor; import top.naccl.entity.VisitRecord; import top.naccl.model.dto.VisitLogUuidTime; @@ -16,10 +16,8 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; /** * @Description: 访客统计相关定时任务 @@ -40,46 +38,48 @@ public class VisitorSyncScheduleTask { CityVisitorService cityVisitorService; /** - * 清空当天Redis访客标识 - * 记录当天的PV和UV - * 更新当天所有访客的PV和最后访问时间 + * 这个方法不应该被直接调用,应当作为定时任务的task,在每天0点执行 + * 每日访问量很大时,这个任务可能很耗时 + *

+ * 清空昨天Redis访客标识 + * 记录昨天的PV和UV + * 更新昨天所有访客的PV和最后访问时间 * 更新城市新增访客UV数 */ public void syncVisitInfoToDatabase() { - //清空当天Redis的访客标识Set,以便统计每日UV - redisService.deleteCacheByKey(RedisKeyConfig.IDENTIFICATION_SET); + //清空昨天Redis的访客标识Set,以便统计每日UV + redisService.deleteCacheByKey(RedisKeyConstants.IDENTIFICATION_SET); //获取昨天的所有访问日志 - List yesterdayLogList = visitLogService.getUUIDAndCreateTimeByYesterday(); - //用Set去重得到当天所有访客的uuid //为避免缓存击穿导致第二天的数据统计不准确,以数据库访问日志为准,而不从Redis中获取这个Set //比如在这个定时任务执行期间,产生大量访客的请求,而这些访客的uuid都在任务执行结束后被清空了,没有被第二天的定时任务记录到 - Set uuidSet = new HashSet(); - Map PVMap = new HashMap(); - Map lastTimeMap = new HashMap(); + List yesterdayLogList = visitLogService.getUUIDAndCreateTimeByYesterday(); + //按每日UV 700的标准初始化map + //TODO 这里可以做个优化,根据近期每日UV数量做对应初始容量适配,避免访问量很大的站点执行此任务时调用过多的resize + Map PVMap = new HashMap(1024); + Map lastTimeMap = new HashMap(1024); yesterdayLogList.forEach(log -> { String uuid = log.getUuid(); Date createTime = log.getTime(); - //记录当天访客的uuid - uuidSet.add(uuid); //对应uuid的PV++ PVMap.merge(uuid, 1, Integer::sum); //因为sql中order by create_time desc,直接put第一次出现的uuid的createTime,就是最后一次访问时间 lastTimeMap.putIfAbsent(uuid, createTime); }); int pv = yesterdayLogList.size(); - int uv = uuidSet.size(); + int uv = PVMap.size(); //获取昨天的日期字符串 String date = new SimpleDateFormat("MM-dd").format(DateUtils.addDays(new Date(), -1)); - //记录当天的PV和UV + //记录昨天的PV和UV visitRecordService.saveVisitRecord(new VisitRecord(pv, uv, date)); - //更新当天所有访客的PV和最后访问时间到数据库 - uuidSet.forEach(uuid -> { - VisitLogUuidTime uuidPVTimeDTO = new VisitLogUuidTime(uuid, lastTimeMap.get(uuid), PVMap.get(uuid)); + //更新昨天所有访客的PV和最后访问时间到数据库 + PVMap.forEach((uuid, views) -> { + VisitLogUuidTime uuidPVTimeDTO = new VisitLogUuidTime(uuid, lastTimeMap.get(uuid), views); visitorService.updatePVAndLastTimeByUUID(uuidPVTimeDTO); }); - //查询当天新增访客的ip来源 + //查询昨天新增访客的ip来源 List ipSource = visitorService.getNewVisitorIpSourceByYesterday(); - Map cityVisitorMap = new HashMap(); + //按每日新增UV 300的标准初始化map + Map cityVisitorMap = new HashMap(512); ipSource.forEach(i -> { if (i.startsWith("中国")) { String[] split = i.split("\\|"); @@ -90,8 +90,6 @@ public void syncVisitInfoToDatabase() { } }); //更新城市新增访客UV数 - cityVisitorMap.forEach((k, v) -> { - cityVisitorService.saveCityVisitor(new CityVisitor(k, v)); - }); + cityVisitorMap.forEach((k, v) -> cityVisitorService.saveCityVisitor(new CityVisitor(k, v))); } } diff --git a/blog-api/src/main/java/top/naccl/util/AopUtils.java b/blog-api/src/main/java/top/naccl/util/AopUtils.java index d10958f88..d48896e14 100644 --- a/blog-api/src/main/java/top/naccl/util/AopUtils.java +++ b/blog-api/src/main/java/top/naccl/util/AopUtils.java @@ -6,8 +6,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; /** * @Description: AOP工具类 @@ -15,6 +17,12 @@ * @Date: 2020年12月02日 */ public class AopUtils { + private static Set ignoreParams = new HashSet() { + { + add("jwt"); + } + }; + /** * 获取请求参数 * @@ -26,7 +34,7 @@ public static Map getRequestParams(JoinPoint joinPoint) { String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames(); Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { - if (!isFilterObject(args[i])) { + if (!isIgnoreParams(parameterNames[i]) && !isFilterObject(args[i])) { map.put(parameterNames[i], args[i]); } } @@ -42,4 +50,14 @@ public static Map getRequestParams(JoinPoint joinPoint) { private static boolean isFilterObject(final Object o) { return o instanceof HttpServletRequest || o instanceof HttpServletResponse || o instanceof MultipartFile; } + + /** + * 判断是否忽略参数 + * + * @param params + * @return + */ + private static boolean isIgnoreParams(String params) { + return ignoreParams.contains(params); + } } diff --git a/blog-api/src/main/java/top/naccl/util/HashUtils.java b/blog-api/src/main/java/top/naccl/util/HashUtils.java index 709f5f659..3e0d87840 100644 --- a/blog-api/src/main/java/top/naccl/util/HashUtils.java +++ b/blog-api/src/main/java/top/naccl/util/HashUtils.java @@ -1,6 +1,6 @@ package top.naccl.util; -import org.apache.commons.codec.digest.MurmurHash3; +import cn.hutool.core.lang.hash.MurmurHash; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.util.DigestUtils; @@ -17,7 +17,7 @@ public static String getMd5(CharSequence str) { } public static long getMurmurHash32(String str) { - int i = MurmurHash3.hash32(str); + int i = MurmurHash.hash32(str); long num = i < 0 ? Integer.MAX_VALUE - (long) i : i; return num; } diff --git a/blog-api/src/main/java/top/naccl/util/ImageUtils.java b/blog-api/src/main/java/top/naccl/util/ImageUtils.java deleted file mode 100644 index c8b2b1b8e..000000000 --- a/blog-api/src/main/java/top/naccl/util/ImageUtils.java +++ /dev/null @@ -1,123 +0,0 @@ -package top.naccl.util; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import top.naccl.exception.BadRequestException; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Base64; -import java.util.Collections; -import java.util.HashMap; -import java.util.UUID; - -/** - * @Description: 图片下载保存工具类 - * @Author: Naccl - * @Date: 2021-11-11 - */ -@Component -public class ImageUtils { - private static RestTemplate restTemplate = new RestTemplate(); - - //GitHub上传文件API - private static final String githubUploadApi = "https://api.github.com/repos/%s/%s/contents%s/%s"; - //GitHub上传文件API - private static final String cdnUrl4Github = "https://cdn.jsdelivr.net/gh/%s/%s%s/%s"; - - //服务访问地址,用于返回图片url - private static String serverUploadPath; - //服务器文件上传路径 - private static String serverUrl; - //GitHub token - private static String githubToken; - //GitHub用户名 - private static String githubUsername; - //GitHub仓库名 - private static String githubRepos; - //GitHub仓库路径 - private static String githubReposPath; - - @Value("${upload.path}") - public void setServerUploadPath(String serverUploadPath) { - this.serverUploadPath = serverUploadPath; - } - - @Value("${custom.url.api}") - public void setServerUrl(String serverUrl) { - this.serverUrl = serverUrl; - } - - @Value("${upload.github.token}") - public void setGithubToken(String githubToken) { - this.githubToken = githubToken; - } - - @Value("${upload.github.username}") - public void setGithubUsername(String githubUsername) { - this.githubUsername = githubUsername; - } - - @Value("${upload.github.repos}") - public void setGithubRepos(String githubRepos) { - this.githubRepos = githubRepos; - } - - @Value("${upload.github.repos.path}") - public void setGithubReposPath(String githubReposPath) { - this.githubReposPath = githubReposPath; - } - - @AllArgsConstructor - @Getter - static class ImageResource { - byte[] data; - //图片拓展名 jpg png - String type; - } - - public static ImageResource getImageByRequest(String url) { - ResponseEntity responseEntity = restTemplate.getForEntity(url, byte[].class); - if ("image".equals(responseEntity.getHeaders().getContentType().getType())) { - return new ImageResource(responseEntity.getBody(), responseEntity.getHeaders().getContentType().getSubtype()); - } - throw new BadRequestException("response contentType unlike image"); - } - - public static String saveImage(ImageResource image) throws IOException { - File folder = new File(serverUploadPath); - if (!folder.exists()) { - folder.mkdirs(); - } - String fileName = UUID.randomUUID() + "." + image.getType(); - FileOutputStream fileOutputStream = new FileOutputStream(serverUploadPath + fileName); - fileOutputStream.write(image.getData()); - fileOutputStream.close(); - return serverUrl + "/image/" + fileName; - } - - public static String push2Github(ImageResource image) { - String fileName = UUID.randomUUID() + "." + image.getType(); - String url = String.format(githubUploadApi, githubUsername, githubRepos, githubReposPath, fileName); - String imgBase64 = Base64.getEncoder().encodeToString(image.getData()); - - HttpHeaders headers = new HttpHeaders(); - headers.put("Authorization", Collections.singletonList("token " + githubToken)); - - HashMap body = new HashMap(); - body.put("message", "Add files via NBlog"); - body.put("content", imgBase64); - - HttpEntity httpEntity = new HttpEntity(body, headers); - restTemplate.put(url, httpEntity); - - return String.format(cdnUrl4Github, githubUsername, githubRepos, githubReposPath, fileName); - } -} diff --git a/blog-api/src/main/java/top/naccl/util/IpAddressUtils.java b/blog-api/src/main/java/top/naccl/util/IpAddressUtils.java index d17f186de..b3280bc9e 100644 --- a/blog-api/src/main/java/top/naccl/util/IpAddressUtils.java +++ b/blog-api/src/main/java/top/naccl/util/IpAddressUtils.java @@ -2,10 +2,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.lionsoul.ip2region.DataBlock; -import org.lionsoul.ip2region.DbConfig; -import org.lionsoul.ip2region.DbSearcher; -import org.lionsoul.ip2region.Util; +import org.lionsoul.ip2region.xdb.Searcher; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; import org.springframework.util.FileCopyUtils; @@ -32,7 +29,10 @@ public class IpAddressUtils { * @return */ public static String getIpAddress(HttpServletRequest request) { - String ip = request.getHeader("x-forwarded-for"); + String ip = request.getHeader("X-Real-IP"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("x-forwarded-for"); + } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } @@ -61,26 +61,24 @@ public static String getIpAddress(HttpServletRequest request) { return StringUtils.substringBefore(ip, ","); } - private static DbSearcher searcher; + private static Searcher searcher; private static Method method; /** * 在服务启动时加载 ip2region.db 到内存中 * 解决打包jar后找不到 ip2region.db 的问题 + * + * @throws Exception 出现异常应该直接抛出终止程序启动,避免后续invoke时出现更多错误 */ @PostConstruct - private void initIp2regionResource() { - try { - InputStream inputStream = new ClassPathResource("/ipdb/ip2region.db").getInputStream(); - //将 ip2region.db 转为 ByteArray - byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream); - DbConfig dbConfig = new DbConfig(); - searcher = new DbSearcher(dbConfig, dbBinStr); - //二进制方式初始化 DBSearcher,需要使用基于内存的查找算法 memorySearch - method = searcher.getClass().getMethod("memorySearch", String.class); - } catch (Exception e) { - log.error("initIp2regionResource exception:", e); - } + private void initIp2regionResource() throws Exception { + InputStream inputStream = new ClassPathResource("/ipdb/ip2region.xdb").getInputStream(); + //将 ip2region.db 转为 ByteArray + byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream); + // 2、使用上述的 dbBinStr 创建一个完全基于内存的查询对象。 + searcher = new Searcher(null, null, dbBinStr); + //二进制方式初始化 DBSearcher,需要使用基于内存的查找算法 memorySearch + method = searcher.getClass().getMethod("search", String.class); } /** @@ -90,13 +88,8 @@ private void initIp2regionResource() { * @return */ public static String getCityInfo(String ip) { - if (ip == null || !Util.isIpAddress(ip)) { - log.error("Error: Invalid ip address"); - return null; - } try { - DataBlock dataBlock = (DataBlock) method.invoke(searcher, ip); - String ipInfo = dataBlock.getRegion(); + String ipInfo = (String) method.invoke(searcher, ip); if (!StringUtils.isEmpty(ipInfo)) { ipInfo = ipInfo.replace("|0", ""); ipInfo = ipInfo.replace("0|", ""); @@ -105,6 +98,12 @@ public static String getCityInfo(String ip) { } catch (Exception e) { log.error("getCityInfo exception:", e); } - return null; + return ""; + } + public static void main(String[] args) throws Exception { + IpAddressUtils ipAddressUtils = new IpAddressUtils(); + ipAddressUtils.initIp2regionResource(); + String cityInfo = IpAddressUtils.getCityInfo("14.215.177.39"); + System.out.println(cityInfo); } } \ No newline at end of file diff --git a/blog-api/src/main/java/top/naccl/util/JwtUtils.java b/blog-api/src/main/java/top/naccl/util/JwtUtils.java index 8743d7b8b..9a895fa27 100644 --- a/blog-api/src/main/java/top/naccl/util/JwtUtils.java +++ b/blog-api/src/main/java/top/naccl/util/JwtUtils.java @@ -22,12 +22,12 @@ public class JwtUtils { @Value("${token.secretKey}") public void setSecretKey(String secretKey) { - this.secretKey = secretKey; + JwtUtils.secretKey = secretKey; } @Value("${token.expireTime}") public void setExpireTime(long expireTime) { - this.expireTime = expireTime; + JwtUtils.expireTime = expireTime; } /** diff --git a/blog-api/src/main/java/top/naccl/util/MailUtils.java b/blog-api/src/main/java/top/naccl/util/MailUtils.java index 04ab9b276..da1b32f34 100644 --- a/blog-api/src/main/java/top/naccl/util/MailUtils.java +++ b/blog-api/src/main/java/top/naccl/util/MailUtils.java @@ -19,8 +19,8 @@ * @Author: Naccl * @Date: 2020年10月10日 */ -@Component @EnableAsync +@Component public class MailUtils { @Autowired private JavaMailSender javaMailSender; diff --git a/blog-api/src/main/java/top/naccl/util/QQInfoUtils.java b/blog-api/src/main/java/top/naccl/util/QQInfoUtils.java index 1a268f701..d7343667f 100644 --- a/blog-api/src/main/java/top/naccl/util/QQInfoUtils.java +++ b/blog-api/src/main/java/top/naccl/util/QQInfoUtils.java @@ -1,9 +1,10 @@ package top.naccl.util; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.client.RestTemplate; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; +import top.naccl.model.vo.QqResultVO; +import top.naccl.model.vo.QqVO; +import top.naccl.util.upload.UploadUtils; /** * @Description: 获取QQ昵称头像信息 @@ -12,52 +13,51 @@ */ public class QQInfoUtils { private static RestTemplate restTemplate = new RestTemplate(); - private static final String QQ_NICKNAME_URL = "https://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins={1}"; + // 原接口半失效,需要提供cookie才可使用,暂时替换为备用接口,感谢 苏晓晴 大佬友情提供 + private static final String QQ_NICKNAME_URL = "https://api.toubiec.cn/api/qqinfo_v4.php?qq={1}"; private static final String QQ_AVATAR_URL = "https://q.qlogo.cn/g?b=qq&nk=%s&s=100"; /** * 获取QQ昵称 * - * @param qq - * @return - * @throws UnsupportedEncodingException + * @param qq qq */ - public static String getQQNickname(String qq) throws UnsupportedEncodingException { - String res = restTemplate.getForObject(QQ_NICKNAME_URL, String.class, qq); - byte[] bytes = res.getBytes("iso-8859-1"); - String nickname = new String(bytes, "gb18030").split(",")[6].replace("\"", ""); - if ("".equals(nickname)) { - return "nickname"; + public static String getQQNickname(String qq) { + QqResultVO qqResultVO = restTemplate.getForObject(QQ_NICKNAME_URL, QqResultVO.class, qq); + if (qqResultVO != null) { + return new ObjectMapper().convertValue(qqResultVO.getData(), QqVO.class).getName(); } - return nickname; - } - - private static ImageUtils.ImageResource getImageResourceByQQ(String qq) { - return ImageUtils.getImageByRequest(String.format(QQ_AVATAR_URL, qq)); + return "nickname"; } /** - * 将QQ头像下载到本地,并返回访问本地图片的URL + * 从网络获取QQ头像数据 * * @param qq - * @return 访问本地图片的URL - * @throws IOException + * @return */ - public static String getQQAvatarURLByServerUpload(String qq) throws IOException { - return ImageUtils.saveImage(getImageResourceByQQ(qq)); + private static UploadUtils.ImageResource getImageResourceByQQ(String qq) { + return UploadUtils.getImageByRequest(String.format(QQ_AVATAR_URL, qq)); } /** - * 将QQ头像上传至GitHub仓库,并返回CDN链接 + * 获取QQ头像URL * * @param qq - * @return 指向该图片的jsDelivr CDN链接 + * @return + * @throws Exception */ - public static String getQQAvatarURLByGithubUpload(String qq) { - return ImageUtils.push2Github(getImageResourceByQQ(qq)); + public static String getQQAvatarUrl(String qq) throws Exception { + return UploadUtils.upload(getImageResourceByQQ(qq)); } - public static boolean isQQNumber(String nickname) { - return nickname.matches("^[1-9][0-9]{4,10}$"); + /** + * 判断是否QQ号 + * + * @param number + * @return + */ + public static boolean isQQNumber(String number) { + return number.matches("^[1-9][0-9]{4,10}$"); } -} \ No newline at end of file +} diff --git a/blog-api/src/main/java/top/naccl/util/UserAgentUtils.java b/blog-api/src/main/java/top/naccl/util/UserAgentUtils.java index cef34d955..47110e816 100644 --- a/blog-api/src/main/java/top/naccl/util/UserAgentUtils.java +++ b/blog-api/src/main/java/top/naccl/util/UserAgentUtils.java @@ -3,9 +3,7 @@ import nl.basjes.parse.useragent.UserAgent; import nl.basjes.parse.useragent.UserAgentAnalyzer; import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; +import top.naccl.model.dto.UserAgentDTO; /** * @Description: UserAgent解析工具类 @@ -19,9 +17,11 @@ public class UserAgentUtils { public UserAgentUtils() { this.uaa = UserAgentAnalyzer .newBuilder() + .useJava8CompatibleCaching() + .withCache(10000) .hideMatcherLoadStats() - .withField("OperatingSystemNameVersionMajor") - .withField("AgentNameVersion") + .withField(UserAgent.OPERATING_SYSTEM_NAME_VERSION_MAJOR) + .withField(UserAgent.AGENT_NAME_VERSION) .build(); } @@ -31,13 +31,10 @@ public UserAgentUtils() { * @param userAgent * @return */ - public Map parseOsAndBrowser(String userAgent) { + public UserAgentDTO parseOsAndBrowser(String userAgent) { UserAgent agent = uaa.parse(userAgent); - String os = agent.getValue("OperatingSystemNameVersionMajor"); - String browser = agent.getValue("AgentNameVersion"); - Map map = new HashMap(); - map.put("os", os); - map.put("browser", browser); - return map; + String os = agent.getValue(UserAgent.OPERATING_SYSTEM_NAME_VERSION_MAJOR); + String browser = agent.getValue(UserAgent.AGENT_NAME_VERSION); + return new UserAgentDTO(os, browser); } } diff --git a/blog-api/src/main/java/top/naccl/util/comment/CommentUtils.java b/blog-api/src/main/java/top/naccl/util/comment/CommentUtils.java new file mode 100644 index 000000000..a6bdc5453 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/comment/CommentUtils.java @@ -0,0 +1,318 @@ +package top.naccl.util.comment; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.DependsOn; +import org.springframework.stereotype.Component; +import top.naccl.config.properties.BlogProperties; +import top.naccl.constant.PageConstants; +import top.naccl.constant.RedisKeyConstants; +import top.naccl.entity.User; +import top.naccl.model.dto.Comment; +import top.naccl.model.vo.FriendInfo; +import top.naccl.service.AboutService; +import top.naccl.service.BlogService; +import top.naccl.service.FriendService; +import top.naccl.service.RedisService; +import top.naccl.service.UserService; +import top.naccl.util.HashUtils; +import top.naccl.util.IpAddressUtils; +import top.naccl.util.MailUtils; +import top.naccl.util.QQInfoUtils; +import top.naccl.util.StringUtils; +import top.naccl.util.comment.channel.ChannelFactory; +import top.naccl.util.comment.channel.CommentNotifyChannel; +import top.naccl.enums.CommentOpenStateEnum; +import top.naccl.enums.CommentPageEnum; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 评论工具类 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@Component +@DependsOn("springContextUtils") +public class CommentUtils { + @Autowired + private BlogProperties blogProperties; + @Autowired + private MailUtils mailUtils; + @Autowired + private AboutService aboutService; + @Autowired + private FriendService friendService; + @Autowired + private UserService userService; + @Autowired + private RedisService redisService; + + private static BlogService blogService; + + private CommentNotifyChannel notifyChannel; + /** + * 新评论是否默认公开 + */ + private Boolean commentDefaultOpen; + + @Autowired + public void setBlogService(BlogService blogService) { + CommentUtils.blogService = blogService; + } + + @Value("${comment.notify.channel}") + public void setNotifyChannel(String channelName) { + this.notifyChannel = ChannelFactory.getChannel(channelName); + } + + @Value("${comment.default-open}") + public void setCommentDefaultOpen(Boolean commentDefaultOpen) { + this.commentDefaultOpen = commentDefaultOpen; + } + + /** + * 判断是否发送提醒 + * 6种情况: + * 1.我以父评论提交:不用提醒 + * 2.我回复我自己:不用提醒 + * 3.我回复访客的评论:只提醒该访客 + * 4.访客以父评论提交:只提醒我自己 + * 5.访客回复我的评论:只提醒我自己 + * 6.访客回复访客的评论(即使是他自己先前的评论):提醒我自己和他回复的评论 + * + * @param comment 当前收到的评论 + * @param isVisitorComment 是否访客评论 + * @param parentComment 父评论 + */ + public void judgeSendNotify(Comment comment, boolean isVisitorComment, top.naccl.entity.Comment parentComment) { + if (parentComment != null && !parentComment.getAdminComment() && parentComment.getNotice()) { + //我回复访客的评论,且对方接收提醒,邮件提醒对方(3) + //访客回复访客的评论(即使是他自己先前的评论),且对方接收提醒,邮件提醒对方(6) + sendMailToParentComment(parentComment, comment); + } + if (isVisitorComment) { + //访客以父评论提交,只提醒我自己(4) + //访客回复我的评论,提醒我自己(5) + //访客回复访客的评论,不管对方是否接收提醒,都要提醒我有新评论(6) + notifyMyself(comment); + } + } + + /** + * 发送邮件提醒回复对象 + * + * @param parentComment 父评论 + * @param comment 当前收到的评论 + */ + private void sendMailToParentComment(top.naccl.entity.Comment parentComment, Comment comment) { + CommentPageEnum commentPageEnum = getCommentPageEnum(comment); + Map map = new HashMap(16); + map.put("parentNickname", parentComment.getNickname()); + map.put("nickname", comment.getNickname()); + map.put("title", commentPageEnum.getTitle()); + map.put("time", comment.getCreateTime()); + map.put("parentContent", parentComment.getContent()); + map.put("content", comment.getContent()); + map.put("url", blogProperties.getView() + commentPageEnum.getPath()); + String toAccount = parentComment.getEmail(); + String subject = "您在 " + blogProperties.getName() + " 的评论有了新回复"; + mailUtils.sendHtmlTemplateMail(map, toAccount, subject, "guest.html"); + } + + /** + * 通过指定方式通知自己 + * + * @param comment 当前收到的评论 + */ + private void notifyMyself(Comment comment) { + notifyChannel.notifyMyself(comment); + } + + /** + * 获取评论对应的页面 + * + * @param comment 当前收到的评论 + * @return CommentPageEnum + */ + public static CommentPageEnum getCommentPageEnum(Comment comment) { + CommentPageEnum commentPageEnum = CommentPageEnum.UNKNOWN; + switch (comment.getPage()) { + case 0: + //普通博客 + commentPageEnum = CommentPageEnum.BLOG; + commentPageEnum.setTitle(blogService.getTitleByBlogId(comment.getBlogId())); + commentPageEnum.setPath("/blog/" + comment.getBlogId()); + break; + case 1: + //关于我页面 + commentPageEnum = CommentPageEnum.ABOUT; + break; + case 2: + //友链页面 + commentPageEnum = CommentPageEnum.FRIEND; + break; + default: + break; + } + return commentPageEnum; + } + + /** + * 查询对应页面评论是否开启 + * + * @param page 页面分类(0普通文章,1关于我,2友链) + * @param blogId 如果page==0,需要博客id参数,校验文章是否公开状态 + * @return CommentOpenStateEnum + */ + public CommentOpenStateEnum judgeCommentState(Integer page, Long blogId) { + switch (page) { + case PageConstants.BLOG: + //普通博客 + Boolean commentEnabled = blogService.getCommentEnabledByBlogId(blogId); + Boolean published = blogService.getPublishedByBlogId(blogId); + if (commentEnabled == null || published == null) { + //未查询到此博客 + return CommentOpenStateEnum.NOT_FOUND; + } else if (!published) { + //博客未公开 + return CommentOpenStateEnum.NOT_FOUND; + } else if (!commentEnabled) { + //博客评论已关闭 + return CommentOpenStateEnum.CLOSE; + } + //判断文章是否存在密码 + String password = blogService.getBlogPassword(blogId); + if (!StringUtils.isEmpty(password)) { + return CommentOpenStateEnum.PASSWORD; + } + break; + case PageConstants.ABOUT: + //关于我页面 + if (!aboutService.getAboutCommentEnabled()) { + //页面评论已关闭 + return CommentOpenStateEnum.CLOSE; + } + break; + case PageConstants.FRIEND: + //友链页面 + FriendInfo friendInfo = friendService.getFriendInfo(true, false); + if (!friendInfo.getCommentEnabled()) { + //页面评论已关闭 + return CommentOpenStateEnum.CLOSE; + } + break; + default: + break; + } + return CommentOpenStateEnum.OPEN; + } + + /** + * 对于昵称不是QQ号的评论,根据昵称Hash设置头像 + * + * @param comment 当前收到的评论 + */ + private void setCommentRandomAvatar(Comment comment) { + //设置随机头像 + //根据评论昵称取Hash,保证每一个昵称对应一个头像 + long nicknameHash = HashUtils.getMurmurHash32(comment.getNickname()); + //计算对应的头像 + long num = nicknameHash % 6 + 1; + String avatar = "/img/comment-avatar/" + num + ".jpg"; + comment.setAvatar(avatar); + } + + /** + * 通用博主评论属性 + * + * @param comment 评论DTO + * @param admin 博主信息 + */ + private void setGeneralAdminComment(Comment comment, User admin) { + comment.setAdminComment(true); + comment.setCreateTime(new Date()); + comment.setPublished(true); + comment.setAvatar(admin.getAvatar()); + comment.setWebsite("/"); + comment.setNickname(admin.getNickname()); + comment.setEmail(admin.getEmail()); + comment.setNotice(false); + } + + /** + * 为[Telegram快捷回复]方式设置评论属性 + * + * @param comment 评论DTO + */ + public void setAdminCommentByTelegramAction(Comment comment) { + //查出博主信息,默认id为1的记录就是博主 + User admin = userService.findUserById(1L); + + setGeneralAdminComment(comment, admin); + comment.setIp("via Telegram"); + } + + /** + * 设置博主评论属性 + * + * @param comment 当前收到的评论 + * @param request 用于获取ip + * @param admin 博主信息 + */ + public void setAdminComment(Comment comment, HttpServletRequest request, User admin) { + setGeneralAdminComment(comment, admin); + comment.setIp(IpAddressUtils.getIpAddress(request)); + } + + /** + * 设置访客评论属性 + * + * @param comment 当前收到的评论 + * @param request 用于获取ip + */ + public void setVisitorComment(Comment comment, HttpServletRequest request) { + comment.setNickname(comment.getNickname().trim()); + setCommentRandomAvatar(comment); + + //check website + if (!isValidUrl(comment.getWebsite())) { + comment.setWebsite(""); + } + comment.setAdminComment(false); + comment.setCreateTime(new Date()); + comment.setPublished(commentDefaultOpen); + comment.setEmail(comment.getEmail().trim()); + comment.setIp(IpAddressUtils.getIpAddress(request)); + } + + /** + * 设置QQ头像,复用已上传过的QQ头像,不再重复上传 + * + * @param comment 当前收到的评论 + * @param qq QQ号 + * @throws Exception 上传QQ头像时可能抛出的异常 + */ + private void setCommentQQAvatar(Comment comment, String qq) throws Exception { + String uploadAvatarUrl = (String) redisService.getValueByHashKey(RedisKeyConstants.QQ_AVATAR_URL_MAP, qq); + if (StringUtils.isEmpty(uploadAvatarUrl)) { + uploadAvatarUrl = QQInfoUtils.getQQAvatarUrl(qq); + redisService.saveKVToHash(RedisKeyConstants.QQ_AVATAR_URL_MAP, qq, uploadAvatarUrl); + } + comment.setAvatar(uploadAvatarUrl); + } + + /** + * URL合法性校验 + * + * @param url url + * @return 是否合法 + */ + private static boolean isValidUrl(String url) { + return url.matches("^https?://([^!@#$%^&*?.\\s-]([^!@#$%^&*?.\\s]{0,63}[^!@#$%^&*?.\\s])?\\.)+[a-z]{2,6}/?"); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/comment/channel/ChannelFactory.java b/blog-api/src/main/java/top/naccl/util/comment/channel/ChannelFactory.java new file mode 100644 index 000000000..1d9b15faa --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/comment/channel/ChannelFactory.java @@ -0,0 +1,27 @@ +package top.naccl.util.comment.channel; + +import top.naccl.constant.CommentConstants; +import top.naccl.util.common.SpringContextUtils; + +/** + * 评论提醒方式 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +public class ChannelFactory { + /** + * 创建评论提醒方式 + * + * @param channelName 方式名称 + * @return + */ + public static CommentNotifyChannel getChannel(String channelName) { + if (CommentConstants.TELEGRAM.equalsIgnoreCase(channelName)) { + return SpringContextUtils.getBean("telegramChannel", CommentNotifyChannel.class); + } else if (CommentConstants.MAIL.equalsIgnoreCase(channelName)) { + return SpringContextUtils.getBean("mailChannel", CommentNotifyChannel.class); + } + throw new RuntimeException("Unsupported value in [application.properties]: [comment.notify.channel]"); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/comment/channel/CommentNotifyChannel.java b/blog-api/src/main/java/top/naccl/util/comment/channel/CommentNotifyChannel.java new file mode 100644 index 000000000..d93703843 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/comment/channel/CommentNotifyChannel.java @@ -0,0 +1,18 @@ +package top.naccl.util.comment.channel; + +import top.naccl.model.dto.Comment; + +/** + * 评论提醒方式 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +public interface CommentNotifyChannel { + /** + * 通过指定方式通知自己 + * + * @param comment 当前收到的评论 + */ + void notifyMyself(Comment comment); +} diff --git a/blog-api/src/main/java/top/naccl/util/comment/channel/MailChannel.java b/blog-api/src/main/java/top/naccl/util/comment/channel/MailChannel.java new file mode 100644 index 000000000..2bd122041 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/comment/channel/MailChannel.java @@ -0,0 +1,54 @@ +package top.naccl.util.comment.channel; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.mail.MailProperties; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import top.naccl.config.properties.BlogProperties; +import top.naccl.model.dto.Comment; +import top.naccl.util.MailUtils; +import top.naccl.enums.CommentPageEnum; +import top.naccl.util.comment.CommentUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * 邮件提醒方式 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@Lazy +@Component +public class MailChannel implements CommentNotifyChannel { + @Autowired + private BlogProperties blogProperties; + @Autowired + private MailProperties mailProperties; + @Autowired + private MailUtils mailUtils; + + /** + * 发送邮件提醒我自己 + * + * @param comment 当前收到的评论 + */ + @Override + public void notifyMyself(Comment comment) { + CommentPageEnum commentPageEnum = CommentUtils.getCommentPageEnum(comment); + Map map = new HashMap(16); + map.put("title", commentPageEnum.getTitle()); + map.put("time", comment.getCreateTime()); + map.put("nickname", comment.getNickname()); + map.put("content", comment.getContent()); + map.put("ip", comment.getIp()); + map.put("email", comment.getEmail()); + map.put("status", comment.getPublished() ? "公开" : "待审核"); + map.put("url", blogProperties.getView() + commentPageEnum.getPath()); + map.put("manageUrl", blogProperties.getCms() + "/comments"); + String toAccount = mailProperties.getUsername(); + String subject = blogProperties.getName() + " 收到新评论"; + mailUtils.sendHtmlTemplateMail(map, toAccount, subject, "owner.html"); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/comment/channel/TelegramChannel.java b/blog-api/src/main/java/top/naccl/util/comment/channel/TelegramChannel.java new file mode 100644 index 000000000..c0581830d --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/comment/channel/TelegramChannel.java @@ -0,0 +1,92 @@ +package top.naccl.util.comment.channel; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import top.naccl.config.properties.BlogProperties; +import top.naccl.config.properties.TelegramProperties; +import top.naccl.enums.CommentPageEnum; +import top.naccl.model.dto.Comment; +import top.naccl.util.StringUtils; +import top.naccl.util.telegram.TelegramUtils; +import top.naccl.util.comment.CommentUtils; + +import java.text.SimpleDateFormat; +import java.util.Map; +import java.util.TimeZone; + +/** + * Telegram提醒方式 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@Slf4j +@Lazy +@Component +public class TelegramChannel implements CommentNotifyChannel { + private TelegramUtils telegramUtils; + + private BlogProperties blogProperties; + + private TelegramProperties telegramProperties; + + private SimpleDateFormat simpleDateFormat; + + public TelegramChannel(TelegramUtils telegramUtils, BlogProperties blogProperties, TelegramProperties telegramProperties) { + this.telegramUtils = telegramUtils; + this.blogProperties = blogProperties; + this.telegramProperties = telegramProperties; + + this.simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + this.simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + + log.info("TelegramChannel instantiating"); + telegramUtils.setWebhook(); + } + + /** + * 发送Telegram消息提醒我自己 + * + * @param comment 当前收到的评论 + */ + @Override + public void notifyMyself(Comment comment) { + String url = telegramProperties.getApi() + telegramProperties.getToken() + TelegramUtils.SEND_MESSAGE; + String content = getContent(comment); + Map messageBody = telegramUtils.getMessageBody(content); + telegramUtils.sendByAutoCheckReverseProxy(url, messageBody); + } + + private String getContent(Comment comment) { + CommentPageEnum commentPageEnum = CommentUtils.getCommentPageEnum(comment); + return String.format( + "您的文章《%s》有了新的评论~\n" + + "\n" + + "%s 给您的评论:\n" + + "\n" + + "

%s
\n" + + "\n" + + "其他信息:\n" + + "评论ID:%d\n" + + "IP:%s\n" + + "%s" + + "时间:%s\n" + + "邮箱:%s\n" + + "%s" + + "状态:%s [管理评论]\n", + blogProperties.getView() + commentPageEnum.getPath(), + commentPageEnum.getTitle(), + comment.getNickname(), + comment.getContent(), + comment.getId(), + comment.getIp(), + StringUtils.isEmpty(comment.getQq()) ? "" : "QQ:" + comment.getQq() + "\n", + simpleDateFormat.format(comment.getCreateTime()), + comment.getEmail(), + StringUtils.isEmpty(comment.getWebsite()) ? "" : "网站:" + comment.getWebsite() + "\n", + comment.getPublished() ? "公开" : "待审核", + blogProperties.getCms() + "/blog/comment/list" + ); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/markdown/MarkdownUtils.java b/blog-api/src/main/java/top/naccl/util/markdown/MarkdownUtils.java index fc8f189c8..6d7702458 100644 --- a/blog-api/src/main/java/top/naccl/util/markdown/MarkdownUtils.java +++ b/blog-api/src/main/java/top/naccl/util/markdown/MarkdownUtils.java @@ -6,6 +6,7 @@ import org.commonmark.ext.gfm.tables.TablesExtension; import org.commonmark.ext.heading.anchor.HeadingAnchorExtension; import org.commonmark.ext.task.list.items.TaskListItemsExtension; +import org.commonmark.node.Image; import org.commonmark.node.Link; import org.commonmark.node.Node; import org.commonmark.parser.Parser; @@ -70,6 +71,12 @@ public AttributeProvider create(AttributeProviderContext context) { private static class CustomAttributeProvider implements AttributeProvider { @Override public void setAttributes(Node node, String tagName, Map attributes) { + // 为懒加载提供属性 + if (node instanceof Image) { + Image n = (Image) node; + attributes.put("data-src", n.getDestination()); + attributes.remove("src"); + } //改变a标签的target属性为_blank if (node instanceof Link) { Link n = (Link) node; diff --git a/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverDelimiterProcessor.java b/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverDelimiterProcessor.java index e2ca99129..b8485c5ad 100644 --- a/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverDelimiterProcessor.java +++ b/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverDelimiterProcessor.java @@ -1,6 +1,8 @@ package top.naccl.util.markdown.ext.cover.internal; import org.commonmark.node.Node; +import org.commonmark.node.Nodes; +import org.commonmark.node.SourceSpans; import org.commonmark.node.Text; import org.commonmark.parser.delimiter.DelimiterProcessor; import org.commonmark.parser.delimiter.DelimiterRun; @@ -27,28 +29,29 @@ public int getMinLength() { return 2; } - @Override - public int getDelimiterUse(DelimiterRun opener, DelimiterRun closer) { - if (opener.length()>= 2 && closer.length()>= 2) { - // Use exactly two delimiters even if we have more, and don't care about internal openers/closers. - return 2; - } else { - return 0; - } - } + @Override + public int process(DelimiterRun openingRun, DelimiterRun closingRun) { + if (openingRun.length()>= 2 && closingRun.length()>= 2) { + // Use exactly two delimiters even if we have more, and don't care about internal openers/closers. + Text opener = openingRun.getOpener(); - @Override - public void process(Text opener, Text closer, int delimiterCount) { - // Wrap nodes between delimiters in cover. - Node cover = new Cover(); - - Node tmp = opener.getNext(); - while (tmp != null && tmp != closer) { - Node next = tmp.getNext(); - cover.appendChild(tmp); - tmp = next; - } - - opener.insertAfter(cover); - } + // Wrap nodes between delimiters in cover. + Node cover = new Cover(); + + SourceSpans sourceSpans = new SourceSpans(); + sourceSpans.addAllFrom(openingRun.getOpeners(2)); + + for (Node node : Nodes.between(opener, closingRun.getCloser())) { + cover.appendChild(node); + sourceSpans.addAll(node.getSourceSpans()); + } + + sourceSpans.addAllFrom(closingRun.getClosers(2)); + cover.setSourceSpans(sourceSpans.getSourceSpans()); + + opener.insertAfter(cover); + return 2; + } + return 0; + } } diff --git a/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverHtmlNodeRenderer.java b/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverHtmlNodeRenderer.java index 7f947d732..b79fb7ccc 100644 --- a/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverHtmlNodeRenderer.java +++ b/blog-api/src/main/java/top/naccl/util/markdown/ext/cover/internal/CoverHtmlNodeRenderer.java @@ -23,7 +23,7 @@ public CoverHtmlNodeRenderer(HtmlNodeRendererContext context) { @Override public void render(Node node) { - Map attributes = new HashMap(); + Map attributes = new HashMap(2); attributes.put("class", "m-text-cover"); html.tag("span", context.extendAttributes(node, "span", attributes)); renderChildren(node); diff --git a/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuDelimiterProcessor.java b/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuDelimiterProcessor.java index 22e274afd..ff5f9460a 100644 --- a/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuDelimiterProcessor.java +++ b/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuDelimiterProcessor.java @@ -1,6 +1,8 @@ package top.naccl.util.markdown.ext.heimu.internal; import org.commonmark.node.Node; +import org.commonmark.node.Nodes; +import org.commonmark.node.SourceSpans; import org.commonmark.node.Text; import org.commonmark.parser.delimiter.DelimiterProcessor; import org.commonmark.parser.delimiter.DelimiterRun; @@ -27,28 +29,29 @@ public int getMinLength() { return 2; } - @Override - public int getDelimiterUse(DelimiterRun opener, DelimiterRun closer) { - if (opener.length()>= 2 && closer.length()>= 2) { - // Use exactly two delimiters even if we have more, and don't care about internal openers/closers. - return 2; - } else { - return 0; - } - } + @Override + public int process(DelimiterRun openingRun, DelimiterRun closingRun) { + if (openingRun.length()>= 2 && closingRun.length()>= 2) { + // Use exactly two delimiters even if we have more, and don't care about internal openers/closers. + Text opener = openingRun.getOpener(); - @Override - public void process(Text opener, Text closer, int delimiterCount) { - // Wrap nodes between delimiters in heimu. - Node heimu = new Heimu(); - - Node tmp = opener.getNext(); - while (tmp != null && tmp != closer) { - Node next = tmp.getNext(); - heimu.appendChild(tmp); - tmp = next; - } - - opener.insertAfter(heimu); - } + // Wrap nodes between delimiters in heimu. + Node heimu = new Heimu(); + + SourceSpans sourceSpans = new SourceSpans(); + sourceSpans.addAllFrom(openingRun.getOpeners(2)); + + for (Node node : Nodes.between(opener, closingRun.getCloser())) { + heimu.appendChild(node); + sourceSpans.addAll(node.getSourceSpans()); + } + + sourceSpans.addAllFrom(closingRun.getClosers(2)); + heimu.setSourceSpans(sourceSpans.getSourceSpans()); + + opener.insertAfter(heimu); + return 2; + } + return 0; + } } diff --git a/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuHtmlNodeRenderer.java b/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuHtmlNodeRenderer.java index 521538e66..27609eec3 100644 --- a/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuHtmlNodeRenderer.java +++ b/blog-api/src/main/java/top/naccl/util/markdown/ext/heimu/internal/HeimuHtmlNodeRenderer.java @@ -23,7 +23,7 @@ public HeimuHtmlNodeRenderer(HtmlNodeRendererContext context) { @Override public void render(Node node) { - Map attributes = new HashMap(); + Map attributes = new HashMap(4); attributes.put("class", "m-text-heimu"); attributes.put("title", "你知道的太多了"); html.tag("span", context.extendAttributes(node, "span", attributes)); diff --git a/blog-api/src/main/java/top/naccl/util/telegram/TelegramBotMsgHandler.java b/blog-api/src/main/java/top/naccl/util/telegram/TelegramBotMsgHandler.java new file mode 100644 index 000000000..dbe24841a --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/telegram/TelegramBotMsgHandler.java @@ -0,0 +1,295 @@ +package top.naccl.util.telegram; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import top.naccl.config.properties.BlogProperties; +import top.naccl.config.properties.TelegramProperties; +import top.naccl.entity.Comment; +import top.naccl.entity.Moment; +import top.naccl.enums.CommentPageEnum; +import top.naccl.service.CommentService; +import top.naccl.service.MomentService; +import top.naccl.util.comment.CommentUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.TimeZone; + +/** + * TelegramBot命令处理 + * + * @author: Naccl + * @date: 2022年01月25日 + */ +@Slf4j +@Lazy +@Component +public class TelegramBotMsgHandler { + @Autowired + private CommentService commentService; + @Autowired + private MomentService momentService; + @Autowired + private TelegramUtils telegramUtils; + @Autowired + private CommentUtils commentUtils; + @Autowired + private BlogProperties blogProperties; + @Autowired + private TelegramProperties telegramProperties; + + private SimpleDateFormat simpleDateFormat; + + private static final String CONTENT_UNKNOWN = ""; + + private static final String CMD_HELP = "/help"; + private static final String CMD_HIDE = "/hide"; + private static final String CMD_SHOW = "/show"; + private static final String CMD_DEL = "/del"; + private static final String CMD_REPLY = "/reply"; + private static final String CMD_MOMENT = "/moment"; + + private static final String HELP_MESSAGE = "可用命令如下:\n" + + "\n" + + "/help - 显示此帮助信息\n" + + "/hide [评论ID] - 隐藏评论\n" + + "/show [评论ID] - 公开评论\n" + + "/del [评论ID] - 删除评论(将删除该评论下的所有子评论)\n" + + "/reply [评论ID] [内容] - 回复评论\n" + + "/moment [内容] - 发布动态\n" + + "\n" + + "例如:/reply 123 好!"; + + public TelegramBotMsgHandler() { + this.simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + this.simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + } + + /** + * 处理指令 + * + * @param message 消息内容 + */ + public void processCommand(String message) { + log.debug("message content: {}", message); + + String cmd = message; + String content = CONTENT_UNKNOWN; + int splitIndex = message.indexOf(" "); + if (splitIndex != -1) { + cmd = message.substring(0, splitIndex); + if (message.length()> splitIndex + 1) { + content = message.substring(splitIndex + 1); + } + } + log.debug("cmd: {}, content: {}", cmd, content); + + String result = ""; + try { + switch (cmd) { + //按id隐藏评论 + case CMD_HIDE: { + result = updateCommentStatus(content, false); + break; + } + //按id公开评论 + case CMD_SHOW: { + result = updateCommentStatus(content, true); + break; + } + //按id删除评论 + case CMD_DEL: { + result = deleteComment(content); + break; + } + //快捷回复评论 + case CMD_REPLY: { + result = replyComment(content); + break; + } + //发动态 + case CMD_MOMENT: { + result = newMoment(content); + break; + } + //显示帮助 + case CMD_HELP: { + result = HELP_MESSAGE; + break; + } + //未知命令,显示帮助 + default: { + result = "未知命令\n\n" + HELP_MESSAGE; + break; + } + } + } catch (Exception e) { + log.error("processCommand catch exception: {}", e); + handleCommandException(e); + } + sendResult(result); + } + + /** + * 修改评论公开状态 + * + * @param msgContent 命令后的消息内容 + * @param status 是否公开 + * @return + */ + private String updateCommentStatus(String msgContent, boolean status) { + long commentId = Long.parseLong(msgContent); + //先查一遍看看是否存在,不存在的话可以catch到提示信息 + commentService.getCommentById(commentId); + //更新评论状态 + commentService.updateCommentPublishedById(commentId, status); + return String.format( + "操作成功!\n" + + "\n" + + "评论ID:%d\n" + + "状态:%s", + commentId, + status ? "公开" : "隐藏" + ); + } + + /** + * 删除评论及其子评论 + * + * @param msgContent 命令后的消息内容 + * @return + */ + private String deleteComment(String msgContent) { + long commentId = Long.parseLong(msgContent); + //先查一遍看看是否存在,不存在的话可以catch到提示信息 + commentService.getCommentById(commentId); + //删除评论及其子评论 + commentService.deleteCommentById(commentId); + return String.format( + "删除成功!\n" + + "\n" + + "评论ID:%d\n" + + "该评论及其子评论已删除", + commentId + ); + } + + /** + * 快捷回复评论 + * + * @param msgContent 命令后的消息内容 + * @return + */ + private String replyComment(String msgContent) { + //[评论ID] 和 [回复内容] 之间的分隔符 + int splitIndex2 = msgContent.indexOf(" "); + if (splitIndex2 != -1 && msgContent.length()> splitIndex2 + 1) { + String commentIdString = msgContent.substring(0, splitIndex2); + String commentContent = msgContent.substring(splitIndex2 + 1); + + long commentId = Long.parseLong(commentIdString); + //先找到要回复的评论 + Comment parentComment = commentService.getCommentById(commentId); + + top.naccl.model.dto.Comment comment = new top.naccl.model.dto.Comment(); + comment.setContent(commentContent); + comment.setParentCommentId(parentComment.getId()); + //父评论所在页面 + Integer page = parentComment.getPage(); + Long blogId = page == 0 ? parentComment.getBlog().getId() : null; + comment.setPage(page); + comment.setBlogId(blogId); + commentUtils.setAdminCommentByTelegramAction(comment); + + //保存评论 + commentService.saveComment(comment); + //提醒回复对象 + commentUtils.judgeSendNotify(comment, false, parentComment); + + CommentPageEnum commentPageEnum = CommentUtils.getCommentPageEnum(comment); + return String.format( + "回复成功!\n" + + "\n" + + "您在《%s》%s 的快捷回复:\n" + + "\n" + + "
%s
\n" + + "\n" + + "其他信息:\n" + + "评论ID:%d\n" + + "IP:%s\n" + + "时间:%s\n" + + "邮箱:%s\n" + + "状态:%s [管理评论]\n", + blogProperties.getView() + commentPageEnum.getPath(), + commentPageEnum.getTitle(), + parentComment.getNickname(), + comment.getContent(), + comment.getId(), + comment.getIp(), + simpleDateFormat.format(comment.getCreateTime()), + comment.getEmail(), + comment.getPublished() ? "公开" : "待审核", + blogProperties.getCms() + "/blog/comment/list" + ); + } + return "命令格式有误!\n\n" + HELP_MESSAGE; + } + + /** + * 发布新动态 + * + * @param content 动态内容 + */ + private String newMoment(String content) { + Moment moment = new Moment(); + moment.setCreateTime(new Date()); + moment.setContent(content); + moment.setLikes(0); + moment.setPublished(true); + momentService.saveMoment(moment); + + return String.format( + "动态发布成功!\n" + + "\n" + + "
%s
\n" + + "\n" + + "其他信息:\n" + + "时间:%s\n" + + "状态:%s [管理动态]\n", + content, + simpleDateFormat.format(moment.getCreateTime()), + moment.getPublished() ? "公开" : "隐藏", + blogProperties.getCms() + "/blog/moment/list" + ); + } + + /** + * 捕获命令处理过程中的全部异常信息并提示 + * + * @param e 异常 + */ + private void handleCommandException(Exception e) { + String result = String.format( + "异常错误:\n" + + "exception: %s\n" + + "message: %s", + e.getClass(), + e.getMessage() + ); + sendResult(result); + } + + /** + * 发送命令处理结果 + * + * @param message 处理结果 + */ + private void sendResult(String message) { + String url = telegramProperties.getApi() + telegramProperties.getToken() + TelegramUtils.SEND_MESSAGE; + Map messageBody = telegramUtils.getMessageBody(message); + telegramUtils.sendByAutoCheckReverseProxy(url, messageBody); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/telegram/TelegramUtils.java b/blog-api/src/main/java/top/naccl/util/telegram/TelegramUtils.java new file mode 100644 index 000000000..e8f31b9c2 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/telegram/TelegramUtils.java @@ -0,0 +1,153 @@ +package top.naccl.util.telegram; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.EnableRetry; +import org.springframework.retry.annotation.Retryable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import top.naccl.config.properties.BlogProperties; +import top.naccl.config.properties.TelegramProperties; + +import java.util.HashMap; +import java.util.Map; + +/** + * Telegram消息工具类 + * + * @author: Naccl + * @date: 2022年01月22日 + */ +@Slf4j +@EnableRetry +@EnableAsync +@Lazy +@Component +public class TelegramUtils { + @Autowired + private RestTemplate restTemplate; + @Autowired + private RestTemplate restTemplateByProxy; + @Autowired + private TelegramProperties telegramProperties; + @Autowired + private BlogProperties blogProperties; + + public static final String SET_WEBHOOK = "/setWebhook"; + public static final String SEND_MESSAGE = "/sendMessage"; + + private static final String PARSE_MODE = "HTML"; + + /** + * 设置Webhook监听地址 + */ + public void setWebhook() { + log.info("start setWebhook"); + + String url = telegramProperties.getApi() + telegramProperties.getToken() + SET_WEBHOOK; + + //与 TelegramBotController#getUpdate 请求地址一致 + String webhook = blogProperties.getApi() + "/tg/" + telegramProperties.getToken(); + + Map data = new HashMap(2); + data.put("url", webhook); + + sendByAutoCheckReverseProxy(url, data); + } + + /** + * 构建POST消息的body + * + * @param content 消息内容 + * @return + */ + public Map getMessageBody(String content) { + Map body = new HashMap(4); + body.put("chat_id", telegramProperties.getChatId()); + body.put("parse_mode", PARSE_MODE); + body.put("text", content); + return body; + } + + /** + * 根据配置检查是否通过反代发送请求 + * 发生异常时重试 + * + * @param url the URL + * @param data body of post + */ + @Retryable( + include = {RestClientException.class}, + maxAttempts = 5, + backoff = @Backoff(delay = 5000L, multiplier = 2) + ) + @Async + public void sendByAutoCheckReverseProxy(String url, Map data) { + if (telegramProperties.getUseReverseProxy()) { + send2ReverseProxy(url, data); + } else { + send2TelegramApi(url, data); + } + } + + /** + * 使用TelegramAPI发送消息 + * + * @param data body of post + */ + private void send2TelegramApi(String url, Map data) { + HttpEntity httpEntity = new HttpEntity(data); + ResponseEntity response = sendPostRequest(url, httpEntity, String.class); + log.info("send2TelegramApi => url: {}", url); + log.info("send2TelegramApi => response: {}", response); + } + + /** + * 通过反向代理发送消息 + * 这是我自己Cloudflare Worker的例子 + * + * @param data body of post + */ + private void send2ReverseProxy(String url, Map data) { + HttpHeaders headers = new HttpHeaders(); + headers.add("content-type", MediaType.APPLICATION_JSON_VALUE); + headers.add("User-Agent", ""); + + Map body = new HashMap(4); + body.put("to", url); + body.put("data", data); + HttpEntity httpEntity = new HttpEntity(body, headers); + + ResponseEntity response = sendPostRequest(telegramProperties.getReverseProxyUrl(), httpEntity, String.class); + log.info("send2ReverseProxy => reverseProxyUrl: {}", telegramProperties.getReverseProxyUrl()); + log.info("send2ReverseProxy => destUrl: {}", url); + log.info("send2ReverseProxy => response: {}", response); + } + + /** + * 根据配置是否启用代理发送请求 + * + * @param url the URL + * @param httpEntity the Object to be POSTed (perhaps null) + * @param responseType responseType + * @param responseType + * @return the converted object + */ + private ResponseEntity sendPostRequest(String url, HttpEntity httpEntity, Class responseType) { + if (telegramProperties.getUseProxy()) { + log.info("sendPostRequest => use proxy"); + return restTemplateByProxy.postForEntity(url, httpEntity, responseType); + } + log.info("sendPostRequest => unused proxy"); + return restTemplate.postForEntity(url, httpEntity, responseType); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/upload/UploadUtils.java b/blog-api/src/main/java/top/naccl/util/upload/UploadUtils.java new file mode 100644 index 000000000..6dedab7d9 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/upload/UploadUtils.java @@ -0,0 +1,69 @@ +package top.naccl.util.upload; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.DependsOn; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import top.naccl.constant.UploadConstants; +import top.naccl.exception.BadRequestException; +import top.naccl.util.upload.channel.ChannelFactory; +import top.naccl.util.upload.channel.FileUploadChannel; + +/** + * @Description: 图片下载保存工具类 + * @Author: Naccl + * @Date: 2021年11月11日 + */ +@Component +@DependsOn("springContextUtils") +public class UploadUtils { + private static RestTemplate restTemplate; + + private static FileUploadChannel uploadChannel; + + @Autowired + public void setRestTemplate(RestTemplate restTemplate) { + UploadUtils.restTemplate = restTemplate; + } + + @Value("${upload.channel}") + public void setNotifyChannel(String channelName) { + UploadUtils.uploadChannel = ChannelFactory.getChannel(channelName); + } + + @AllArgsConstructor + @Getter + public static class ImageResource { + byte[] data; + //图片拓展名 jpg png + String type; + } + + /** + * 通过指定方式存储图片 + * + * @param image 需要保存的图片 + * @throws Exception + */ + public static String upload(ImageResource image) throws Exception { + return uploadChannel.upload(image); + } + + /** + * 从网络获取图片数据 + * + * @param url 图片URL + * @return + */ + public static ImageResource getImageByRequest(String url) { + ResponseEntity responseEntity = restTemplate.getForEntity(url, byte[].class); + if (UploadConstants.IMAGE.equals(responseEntity.getHeaders().getContentType().getType())) { + return new ImageResource(responseEntity.getBody(), responseEntity.getHeaders().getContentType().getSubtype()); + } + throw new BadRequestException("response contentType unlike image"); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/upload/channel/ChannelFactory.java b/blog-api/src/main/java/top/naccl/util/upload/channel/ChannelFactory.java new file mode 100644 index 000000000..6a92837b2 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/upload/channel/ChannelFactory.java @@ -0,0 +1,30 @@ +package top.naccl.util.upload.channel; + +import top.naccl.constant.UploadConstants; +import top.naccl.util.common.SpringContextUtils; + +/** + * 文件上传方式 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +public class ChannelFactory { + /** + * 创建文件上传方式 + * + * @param channelName 方式名称 + * @return 文件上传Channel + */ + public static FileUploadChannel getChannel(String channelName) { + switch (channelName.toLowerCase()) { + case UploadConstants.LOCAL: + return SpringContextUtils.getBean(LocalChannel.class); + case UploadConstants.GITHUB: + return SpringContextUtils.getBean(GithubChannel.class); + case UploadConstants.UPYUN: + return SpringContextUtils.getBean(UpyunChannel.class); + } + throw new RuntimeException("Unsupported value in [application.properties]: [upload.channel]"); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/upload/channel/FileUploadChannel.java b/blog-api/src/main/java/top/naccl/util/upload/channel/FileUploadChannel.java new file mode 100644 index 000000000..ae30fd283 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/upload/channel/FileUploadChannel.java @@ -0,0 +1,20 @@ +package top.naccl.util.upload.channel; + +import top.naccl.util.upload.UploadUtils; + +/** + * 文件上传方式 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +public interface FileUploadChannel { + /** + * 通过指定方式上传文件 + * + * @param image 需要保存的图片 + * @return 访问图片的URL + * @throws Exception + */ + String upload(UploadUtils.ImageResource image) throws Exception; +} diff --git a/blog-api/src/main/java/top/naccl/util/upload/channel/GithubChannel.java b/blog-api/src/main/java/top/naccl/util/upload/channel/GithubChannel.java new file mode 100644 index 000000000..7ae6eb802 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/upload/channel/GithubChannel.java @@ -0,0 +1,63 @@ +package top.naccl.util.upload.channel; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import top.naccl.config.properties.GithubProperties; +import top.naccl.util.upload.UploadUtils; + +import java.util.Base64; +import java.util.HashMap; +import java.util.UUID; + +/** + * GitHub上传方式 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +@Lazy +@Component +public class GithubChannel implements FileUploadChannel { + /** + * GitHub上传文件API + */ + private static final String githubUploadApi = "https://api.github.com/repos/%s/%s/contents%s/%s"; + /** + * jsDelivr的CDN链接 + */ + private static final String cdnUrl4Github = "https://fastly.jsdelivr.net/gh/%s/%s%s/%s"; + + @Autowired + private GithubProperties githubProperties; + @Autowired + private RestTemplate restTemplate; + + /** + * 将图片上传至GitHub仓库,并返回CDN链接 + * + * @param image 需要上传的图片 + * @return 访问图片的URL + */ + @Override + public String upload(UploadUtils.ImageResource image) { + String fileName = UUID.randomUUID() + "." + image.getType(); + String url = String.format(githubUploadApi, githubProperties.getUsername(), githubProperties.getRepos(), githubProperties.getReposPath(), fileName); + String imgBase64 = Base64.getEncoder().encodeToString(image.getData()); + + HttpHeaders headers = new HttpHeaders(); + headers.add("Authorization", "token " + githubProperties.getToken()); + + HashMap body = new HashMap(4); + body.put("message", "Add files via NBlog"); + body.put("content", imgBase64); + + HttpEntity httpEntity = new HttpEntity(body, headers); + restTemplate.put(url, httpEntity); + + return String.format(cdnUrl4Github, githubProperties.getUsername(), githubProperties.getRepos(), githubProperties.getReposPath(), fileName); + } +} diff --git a/blog-api/src/main/java/top/naccl/util/upload/channel/LocalChannel.java b/blog-api/src/main/java/top/naccl/util/upload/channel/LocalChannel.java new file mode 100644 index 000000000..26098e797 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/upload/channel/LocalChannel.java @@ -0,0 +1,47 @@ +package top.naccl.util.upload.channel; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import top.naccl.config.properties.BlogProperties; +import top.naccl.config.properties.UploadProperties; +import top.naccl.util.upload.UploadUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.UUID; + +/** + * 本地存储方式 + * + * @author: Naccl + * @date: 2022年01月23日 + */ +@Lazy +@Component +public class LocalChannel implements FileUploadChannel { + @Autowired + private BlogProperties blogProperties; + @Autowired + private UploadProperties uploadProperties; + + /** + * 将图片保存到本地,并返回访问本地图片的URL + * + * @param image 需要保存的图片 + * @return 访问图片的URL + * @throws Exception + */ + @Override + public String upload(UploadUtils.ImageResource image) throws Exception { + File folder = new File(uploadProperties.getPath()); + if (!folder.exists()) { + folder.mkdirs(); + } + String fileName = UUID.randomUUID() + "." + image.getType(); + FileOutputStream fileOutputStream = new FileOutputStream(uploadProperties.getPath() + fileName); + fileOutputStream.write(image.getData()); + fileOutputStream.close(); + return blogProperties.getApi() + "/image/" + fileName; + } +} diff --git a/blog-api/src/main/java/top/naccl/util/upload/channel/UpyunChannel.java b/blog-api/src/main/java/top/naccl/util/upload/channel/UpyunChannel.java new file mode 100644 index 000000000..8358b9567 --- /dev/null +++ b/blog-api/src/main/java/top/naccl/util/upload/channel/UpyunChannel.java @@ -0,0 +1,38 @@ +package top.naccl.util.upload.channel; + +import com.upyun.RestManager; +import okhttp3.Response; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import top.naccl.config.properties.UpyunProperties; +import top.naccl.util.upload.UploadUtils; + +import java.util.UUID; + +/** + * 又拍云存储上传方式 + * + * @author: Naccl + * @date: 2022年05月26日 + */ +@Lazy +@Component +public class UpyunChannel implements FileUploadChannel { + private RestManager manager; + private UpyunProperties upyunProperties; + + public UpyunChannel(UpyunProperties upyunProperties) { + this.upyunProperties = upyunProperties; + this.manager = new RestManager(upyunProperties.getBucketName(), upyunProperties.getUsername(), upyunProperties.getPassword()); + } + + @Override + public String upload(UploadUtils.ImageResource image) throws Exception { + String fileAbsolutePath = upyunProperties.getPath() + "/" + UUID.randomUUID() + "." + image.getType(); + Response response = manager.writeFile(fileAbsolutePath, image.getData(), null); + if (!response.isSuccessful()) { + throw new RuntimeException("又拍云上传失败"); + } + return upyunProperties.getDomain() + fileAbsolutePath; + } +} diff --git a/blog-api/src/main/resources/application-dev.properties b/blog-api/src/main/resources/application-dev.properties index 1cc73da21..67cee1ac1 100644 --- a/blog-api/src/main/resources/application-dev.properties +++ b/blog-api/src/main/resources/application-dev.properties @@ -1,54 +1,94 @@ +# 服务器端口号 server.port=8090 - -custom.blog.name=Naccl's Blog -# \u90E8\u7F72\u4E0A\u7EBF\u9700\u8981\u4FEE\u6539\u4E3A\u670D\u52A1\u5668ip\u6216\u57DF\u540D -# api\u5BF9\u5E94\u540E\u7AEF\u670D\u52A1\u7AEF\u53E3 https://api.naccl.top/blog -custom.url.api=http://localhost:${server.port} -# cms\u5BF9\u5E94\u540E\u53F0\u7BA1\u7406\u7AEF\u53E3 https://admin.naccl.top -custom.url.cms=http://localhost:8080 -# website\u5BF9\u5E94\u524D\u53F0\u7AEF\u53E3 https://naccl.top -custom.url.website=http://localhost:8081 - +# 博客名称 +blog.name=Naccl's Blog +# 生产环境需要修改为服务器ip或域名 +# 后端服务URL https://api.naccl.top/blog +blog.api=http://localhost:${server.port} +# 后台管理URL https://admin.naccl.top +blog.cms=http://localhost:8080 +# 前台界面URL https://naccl.top +blog.view=http://localhost:8081 +# 数据库连接信息 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/nblog?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=root - +# Redis连接信息 spring.redis.host=192.168.17.132 spring.redis.password=123456 spring.redis.port=6379 spring.redis.database=0 spring.redis.timeout=10000ms - +# MyBatis配置 mybatis.mapper-locations=classpath:mapper/*.xml mybatis.configuration.map-underscore-to-camel-case=true - +# 日志级别配置 logging.level.root=info logging.level.top.naccl=debug logging.file=blog-api/log/blog-dev -# 1000 * 60 * 60 * 24 * 3 \u4E09\u5929 +# 1000 * 60 * 60 * 24 * 3 token过期时间 token.expireTime=259200000 -# \u90E8\u7F72\u4E0A\u7EBF\u52A1\u5FC5\u4FEE\u6539\u6B64\u914D\u7F6E\uFF0C\u5426\u5219\u65E0\u6CD5\u4FDD\u8BC1token\u5B89\u5168\u6027 +# 生产环境务必修改此配置,否则无法保证token安全性 token.secretKey=abcdefghijklmnopqrstuvwxyz -# \u963F\u91CC\u4E91\u90AE\u7BB1\uFF0Cport=25\u5728Windows\u7CFB\u7EDF\u4E0B\u6709\u6548\uFF0CLinux\u7CFB\u7EDF\u9700\u8981\u6539\u4E3A465\u5E76\u5C06\u4E0B\u9762\u4E24\u884C\u53D6\u6D88\u6CE8\u91CA\uFF0C\u5176\u5B83\u90AE\u7BB1\u670D\u52A1\u5546\u914D\u7F6E\u53C2\u8003\u5173\u952E\u5B57"spring mail \u670D\u52A1\u5668" -# spring.mail.properties.mail.smtp.socketFactory.port=465 -# spring.mail.properties.mail.smtp.ssl.enable=true +# 博主接收评论提醒方式: Telegram=tg 邮箱=mail (访客评论提醒固定为邮箱方式) +comment.notify.channel=mail +# 新评论是否默认公开 +comment.default-open=true + +# 如果选择邮箱提醒方式,则会在收到评论后向填写的邮箱自身发送一封邮件(提醒自己);如果选择tg,则填写的邮箱只作为提醒访客的发送方 +# 阿里云邮箱,其它邮箱服务商配置参考关键字"spring mail 服务器" spring.mail.host=smtp.mxhichina.com -spring.mail.port=25 -spring.mail.username=\u90AE\u7BB1\u8D26\u53F7 -spring.mail.password=\u90AE\u7BB1\u5BC6\u7801 +spring.mail.port=465 +spring.mail.username=admin@example.com +spring.mail.password=123456 +spring.mail.properties.mail.smtp.socketFactory.port=465 +spring.mail.properties.mail.smtp.ssl.enable=true + +# 如果选择邮箱提醒方式,以下可以无需修改 +tg.bot.api=https://api.telegram.org/bot +# bot的token,可以从 @BotFather 处获取 +tg.bot.token=1234567890:qwertyuiopasdfghjklzxcvbnm +# 自己账号和bot的聊天会话id +tg.bot.chat-id=1234567890 +# 是否使用代理 +tg.bot.use-proxy=false +# 是否使用反向代理 +tg.bot.use-reverse-proxy=true +# 反向代理URL,请自行搭建,示例API随时可能关闭 +tg.bot.reverse-proxy-url=https://tg-api-open.naccl.workers.dev + +# 代理配置,如不使用无需修改 (目前用于发送Telegram请求) +http.proxy.server.host=127.0.0.1 +http.proxy.server.port=7890 +http.proxy.server.timeout=10000 -# \u9759\u6001\u6587\u4EF6\u4E0A\u4F20\u8BBF\u95EE\u8DEF\u5F84 Linux\u73AF\u5883\u5982\uFF1A/home/nblog/upload/ -upload.path=C:/Users/luadmin/Desktop/upload/ -upload.access.path=/image/** -upload.resources.locations=file:${upload.path} +# 评论中QQ头像存储方式: 本地:local GitHub:github 又拍云:upyun +upload.channel=local -# GitHub token \u6559\u7A0B\u89C1 https://naccl.github.io/PictureHosting/#/pictureHosting/help +# 静态文件上传访问路径 Windows环境例如: C:/Users/nblog/Desktop/upload/ Linux环境例如:/home/nblog/upload/ +upload.file.path=/Users/naccl/Desktop/upload/ +upload.file.access-path=/image/** +upload.file.resources-locations=file:${upload.file.path} + +# 如果选择其它上传方式,以下可以无需修改 +# GitHub token 教程见 https://naccl.github.io/PictureHosting/#/pictureHosting/help upload.github.token=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx upload.github.username=Naccl -# \u9700\u8981\u7528\u4F5C\u56FE\u5E8A\u7684GitHub\u4ED3\u5E93\u540D +# 需要用作图床的GitHub仓库名 upload.github.repos=test -# \u9700\u8981\u4E0A\u4F20\u81F3\u4ED3\u5E93\u7684\u8DEF\u5F84 \u5F00\u5934\u9700\u8981"/" \u7ED3\u5C3E\u4E0D\u8981"/" -upload.github.repos.path=/comment/avatar \ No newline at end of file +# 需要上传至仓库的路径 开头需要"/" 结尾不要"/" +upload.github.repos-path=/comment/avatar + +# 又拍云存储空间名称,帮助文档见 https://help.upyun.com/knowledge-base/quick_start/ +upload.upyun.bucket-name=nblog +# 操作员名称 +upload.upyun.username=naccl +# 操作员密码 +upload.upyun.password=xxxxxxxxxxxxxxxxxxxxxxxxxxxx +# 存储路径 +upload.upyun.path=/comment/avatar +# CDN访问域名 +upload.upyun.domain=https://cdn.example.com diff --git a/blog-api/src/main/resources/ipdb/ip2region.xdb b/blog-api/src/main/resources/ipdb/ip2region.xdb new file mode 100644 index 000000000..31f96a1fb Binary files /dev/null and b/blog-api/src/main/resources/ipdb/ip2region.xdb differ diff --git a/blog-api/src/main/resources/mapper/UserMapper.xml b/blog-api/src/main/resources/mapper/UserMapper.xml index a16d23b24..d8caeb919 100644 --- a/blog-api/src/main/resources/mapper/UserMapper.xml +++ b/blog-api/src/main/resources/mapper/UserMapper.xml @@ -5,4 +5,14 @@ + + + + + + + update user set username=#{user.username}, password=#{user.password}, update_time=now() where username=#{username} + diff --git a/blog-api/src/main/resources/templates/guest.html b/blog-api/src/main/resources/templates/guest.html index fd1d2b653..1e0a5cddd 100644 --- a/blog-api/src/main/resources/templates/guest.html +++ b/blog-api/src/main/resources/templates/guest.html @@ -6,7 +6,7 @@
- +

@@ -29,4 +29,4 @@

AltStyle によって変換されたページ (->オリジナル) /

- \ No newline at end of file + diff --git a/blog-api/src/main/resources/templates/owner.html b/blog-api/src/main/resources/templates/owner.html index 73625eb0a..65ef12ae5 100644 --- a/blog-api/src/main/resources/templates/owner.html +++ b/blog-api/src/main/resources/templates/owner.html @@ -6,7 +6,7 @@
- +

您的文章有了新的评论~

@@ -21,4 +21,4 @@

查看回复的完整內容

- \ No newline at end of file + diff --git a/blog-cms/package-lock.json b/blog-cms/package-lock.json deleted file mode 100644 index 18d4d4939..000000000 --- a/blog-cms/package-lock.json +++ /dev/null @@ -1,12066 +0,0 @@ -{ - "name": "blog-cms", - "version": "2.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.0.tgz", - "integrity": "sha1-DfyAMJvuyEEeZecGRhxAiwu5tDE=", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/download/@babel/compat-data-7.16.0.tgz?cache=0&sync_timestamp=1635560942494&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcompat-data%2Fdownload%2F%40babel%2Fcompat-data-7.16.0.tgz", - "integrity": "sha1-6iadf3jes6eCbDmkBI7s2lQevao=", - "dev": true - }, - "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/core/download/@babel/core-7.16.0.tgz?cache=0&sync_timestamp=1635560662864&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.16.0.tgz", - "integrity": "sha1-xP9EBG9f4xBSXMnrTvUUfwxTdNQ=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/generator/download/@babel/generator-7.16.0.tgz", - "integrity": "sha1-1A89HVB15i01ALzLZ/PaqKlSZbI=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz?cache=0&sync_timestamp=1635560944976&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha1-8aaGuS2nlAIMJlguuFLprM0NeII=", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha1-AdYVdi55bBeVLCnj7enW3gfSNag=", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.16.0.tgz?cache=0&sync_timestamp=1635560940029&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha1-CQ1NFms0KgOp/sN+9P1a65x8aks=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.16.0.tgz?cache=0&sync_timestamp=1635567015952&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-create-regexp-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-regexp-features-plugin-7.16.0.tgz", - "integrity": "sha1-BrI0jON/zMT14Y3NjXUFPyp8RP8=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha1-iGeu150+psreQPgB77esXGaRaxA=", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.16.0.tgz?cache=0&sync_timestamp=1635567238246&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.16.0.tgz", - "integrity": "sha1-dTAXM3oV9G+cCfZ0z/EM7pudd3g=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/download/@babel/helper-function-name-7.16.0.tgz?cache=0&sync_timestamp=1635560944177&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.16.0.tgz", - "integrity": "sha1-t90Hl9ALv+5PB+nE6lsOMMi7FIE=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.0.tgz?cache=0&sync_timestamp=1635560945700&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.16.0.tgz", - "integrity": "sha1-AIjHSGspqctdlIsaHeRttm4InPo=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.0.tgz?cache=0&sync_timestamp=1635560943828&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.16.0.tgz", - "integrity": "sha1-TJAjwvHe9+KP9G/B2802o5vqqBo=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.16.0.tgz?cache=0&sync_timestamp=1635560945366&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha1-KShwQO/Rl8d2Nu91GI6B2ovM1aQ=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.0.tgz?cache=0&sync_timestamp=1635560941965&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.16.0.tgz", - "integrity": "sha1-kFOOYLZy7PG0SPX09UM9N+eaPsM=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.0.tgz", - "integrity": "sha1-HIKo3UyzRXdQLr0pCWmbGUw+m7U=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.16.0.tgz?cache=0&sync_timestamp=1635560944574&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha1-zs2xRdcMVAlrFWT46fEM19GTszg=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.nlark.com/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.14.5.tgz?cache=0&sync_timestamp=1623280794347&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-plugin-utils%2Fdownload%2F%40babel%2Fhelper-plugin-utils-7.14.5.tgz", - "integrity": "sha1-WsgizpfuxGdBq3ClF5ceRDpwxak=", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.16.0.tgz?cache=0&sync_timestamp=1635567015463&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-remap-async-to-generator%2Fdownload%2F%40babel%2Fhelper-remap-async-to-generator-7.16.0.tgz", - "integrity": "sha1-1ao7CG4Tpf4FI4/0DDpaDC2rPq0=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.16.0.tgz?cache=0&sync_timestamp=1635560943145&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.16.0.tgz", - "integrity": "sha1-cwVejTz5vLqN21XK2T/tyGD2jxc=", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.0.tgz?cache=0&sync_timestamp=1635560942808&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.16.0.tgz", - "integrity": "sha1-IdaidiDjg+N1NM9sELugGab5BRc=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.16.0.tgz?cache=0&sync_timestamp=1635566957303&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.0.tgz?cache=0&sync_timestamp=1635560943488&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.16.0.tgz", - "integrity": "sha1-KWcvQ2Y+k23zcKrrIr7ds7rsdDg=", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha1-Ig35k7/pBKSmsCq08zhaXr9uI4k=", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.nlark.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz?cache=0&sync_timestamp=1623280794147&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-option%2Fdownload%2F%40babel%2Fhelper-validator-option-7.14.5.tgz", - "integrity": "sha1-bnKh//GNXfy4eOHmLxoCHEty1aM=", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.16.0.tgz?cache=0&sync_timestamp=1635567238019&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.16.0.tgz", - "integrity": "sha1-s88xivzndN/nW4Z2fNbWjzSC5Xw=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helpers": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/helpers/download/@babel/helpers-7.16.0.tgz", - "integrity": "sha1-h1UZyXnCMvQa371Do7A5jC44gYM=", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/highlight/download/@babel/highlight-7.16.0.tgz?cache=0&sync_timestamp=1635560845502&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.16.0.tgz", - "integrity": "sha1-bOsysspLj182H7f9gh4/3fShclo=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.16.2", - "resolved": "https://registry.npmmirror.com/@babel/parser/download/@babel/parser-7.16.2.tgz", - "integrity": "sha1-NyPNXI2Hc+75bOV+odm3+qzNEqw=", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/download/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-bugfix-safari-id-destructuring-collision-in-function-expression%2Fdownload%2F%40babel%2Fplugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.0.tgz", - "integrity": "sha1-77fxRwQqyjTOgVagVZBqerqt6vA=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-bugfix-v8-spread-parameters-in-optional-chaining%2Fdownload%2F%40babel%2Fplugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", - "integrity": "sha1-NYly6qsAb16wgmGDsMk8vK8T4eI=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.16.0.tgz", - "integrity": "sha1-EUJdR6YDZDUvZorV+8HWWWssXK8=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha1-wClhgmfd68coD6KG4PjKKieKLRo=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha1-UpaULFZNgUTIPuo0fQqooLiRcOc=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.16.0.tgz", - "integrity": "sha1-UV219okWEcDRdrY+3ghE+9m+eXs=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-decorators": "^7.16.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha1-eD7KYdUFJiAvmylglUU5d+iGWfE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha1-nAHe5Auda4R7ZWqvSjl2pxdA8iI=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha1-yuNale0dKn+inE3EFUC4SnLpqyU=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha1-pxG4zrP/3dPviNOknobb08x9s/0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha1-ROHM4I/iQnSCz0RqkbtFFSjtBZY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha1-XUGOT7v4ubfQMSXTpScwQzo3NzQ=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha1-X7MvbZJNbmcSgQNipg4SomCYcuY=", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha1-WRAIWBGrTCiwDW6/+kqwJ00eXxY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha1-VtvDlwglaDYI6e+1XqgsKi1sjcA=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha1-tNr7nHF+QwHFd2sw0IDWODyJr/Y=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha1-aek1ssXHnSSIES2IbwxOJ5D+528=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha1-iQSC38XqN45C4Zpx5wlyjKvxhhI=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz?cache=0&sync_timestamp=1612314829085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-class-properties%2Fdownload%2F%40babel%2Fplugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.nlark.com/@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz?cache=0&sync_timestamp=1623280714275&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-class-static-block%2Fdownload%2F%40babel%2Fplugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.16.0.tgz", - "integrity": "sha1-642BHN0QYPasPACVa/P2M1UFoy8=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.16.0.tgz", - "integrity": "sha1-+WJDlDFzZamojII1jT+EcRVGmPE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz?cache=0&sync_timestamp=1593523422434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-numeric-separator%2Fdownload%2F%40babel%2Fplugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.nlark.com/@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz?cache=0&sync_timestamp=1623280716523&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-private-property-in-object%2Fdownload%2F%40babel%2Fplugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.nlark.com/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz?cache=0&sync_timestamp=1623280804775&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fplugin-syntax-top-level-await%2Fdownload%2F%40babel%2Fplugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha1-lRcG+LRJyDTtB71HTAkkyUS5Wo4=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha1-3xJjf5Yw3foO+dehG8QU1inThgQ=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha1-xhh2MjOtAoR4BavKxMNFzp3nFF0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha1-vPQz+0gv6MPTtOimaxxKjnfTfBY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.16.0.tgz?cache=0&sync_timestamp=1635566945526&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.16.0.tgz", - "integrity": "sha1-VM9f8LIkLGVz11PNS/xwd6iygvU=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha1-4MOFUH0h4bCwdtZr7W1SMbhRELc=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha1-rT1+dFhK1epOrbHmZCFGxZDe4zw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha1-ULqwDBCEthYtClioGAMc9XeY4G8=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha1-i8LiGBPj6J5eW/O2CqX8RYV1oXY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.16.0.tgz?cache=0&sync_timestamp=1635566989126&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-exponentiation-operator%2Fdownload%2F%40babel%2Fplugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha1-oYDNKIHjUzzvnTkB5I2tD77/S+Q=", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.16.0.tgz?cache=0&sync_timestamp=1635567508437&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-for-of%2Fdownload%2F%40babel%2Fplugin-transform-for-of-7.16.0.tgz", - "integrity": "sha1-96us7RVSYOJGE1m7x8ckispea9I=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.16.0.tgz?cache=0&sync_timestamp=1635566911742&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-function-name%2Fdownload%2F%40babel%2Fplugin-transform-function-name-7.16.0.tgz", - "integrity": "sha1-AuNpnChMYmIjZZn3UQZcXV8fQA4=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.16.0.tgz?cache=0&sync_timestamp=1635566948325&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-literals%2Fdownload%2F%40babel%2Fplugin-transform-literals-7.16.0.tgz", - "integrity": "sha1-eXEeZw/86zG9KYIp1Q82IfeYDKw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.16.0.tgz?cache=0&sync_timestamp=1635566948649&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-member-expression-literals%2Fdownload%2F%40babel%2Fplugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha1-UlG0zOAer4MUQD0hrtsmnXn15ks=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.16.0.tgz?cache=0&sync_timestamp=1635566912764&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha1-CavUHhjc9P1HnFmMHO97056xM34=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.16.0.tgz?cache=0&sync_timestamp=1635566912532&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha1-rdWOY4yN3Eh1vZqey1xZRhP2ySI=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.16.0", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.16.0.tgz?cache=0&sync_timestamp=1635566913014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha1-qSzyQK/rYF9MoWZwRTAkQl5CHqQ=", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.15.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.16.0.tgz?cache=0&sync_timestamp=1635566913244&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-modules-umd%2Fdownload%2F%40babel%2Fplugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha1-GV8mwq1tajkbcIgO/84YzmJeBqc=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha1-09thzF1bl5hlWZZ81eqD5cMglso=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.16.0.tgz?cache=0&sync_timestamp=1635566951246&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-new-target%2Fdownload%2F%40babel%2Fplugin-transform-new-target-7.16.0.tgz", - "integrity": "sha1-r4I6tXb3UiFaSZN3eaQcplglqzU=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.16.0.tgz?cache=0&sync_timestamp=1635566913937&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.16.0.tgz", - "integrity": "sha1-+yDVgG3GSRoGKWrBTqjo1v7dpys=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.16.0.tgz?cache=0&sync_timestamp=1635566914182&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-parameters%2Fdownload%2F%40babel%2Fplugin-transform-parameters-7.16.0.tgz", - "integrity": "sha1-G1B2X8QhwimBncTHzbiRFmCzwtc=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.16.0.tgz?cache=0&sync_timestamp=1635566952712&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-property-literals%2Fdownload%2F%40babel%2Fplugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha1-qVxVIYmpagAFn2d23E4A42kMeNE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.16.0.tgz?cache=0&sync_timestamp=1635566914723&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-regenerator%2Fdownload%2F%40babel%2Fplugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha1-6u5CLISwIy0Drqfbmcl97q9hJaQ=", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.16.0.tgz?cache=0&sync_timestamp=1635566953412&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-reserved-words%2Fdownload%2F%40babel%2Fplugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha1-//S53LGeEmGTlL2hctFPLQTAN5w=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.16.0.tgz", - "integrity": "sha1-P+DaNsLwg0vvfE0+fystsO4MiQk=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.3", - "babel-plugin-polyfill-corejs3": "^0.3.0", - "babel-plugin-polyfill-regenerator": "^0.2.3", - "semver": "^6.3.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.16.0.tgz?cache=0&sync_timestamp=1635566953711&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-shorthand-properties%2Fdownload%2F%40babel%2Fplugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha1-CQNy4xQffMMk7XCz2vU3nfL6OE0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.16.0.tgz?cache=0&sync_timestamp=1635566954049&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.16.0.tgz", - "integrity": "sha1-0hygmbvVOrMHqGIeAZp70PQM3Ps=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.16.0.tgz?cache=0&sync_timestamp=1635566954378&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-sticky-regex%2Fdownload%2F%40babel%2Fplugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha1-w16jGgLYa+SF9qpRAYS2d6kXOP0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.16.0.tgz?cache=0&sync_timestamp=1635566917280&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-template-literals%2Fdownload%2F%40babel%2Fplugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha1-qOztOo57ji1A7E7EVIpFkSYw0wI=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.16.0.tgz?cache=0&sync_timestamp=1635566955088&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha1-ixmiRMb4ydZo3Kam91Stbq0RKPI=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.16.0.tgz?cache=0&sync_timestamp=1635566955407&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-transform-unicode-escapes%2Fdownload%2F%40babel%2Fplugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha1-GjVAZLTEVmOjIzT0b6DPYQC1sfM=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha1-KTuAlQF3yMha7eh87ygCWfuZVAI=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/preset-env": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/preset-env/download/@babel/preset-env-7.16.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fpreset-env%2Fdownload%2F%40babel%2Fpreset-env-7.16.0.tgz", - "integrity": "sha1-lyKDk9IXVg1qHGxW8K250SvKZ/U=", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", - "@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-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-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.0", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.2.3", - "babel-plugin-polyfill-corejs3": "^0.3.0", - "babel-plugin-polyfill-regenerator": "^0.2.3", - "core-js-compat": "^3.19.0", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmmirror.com/@babel/preset-modules/download/@babel/preset-modules-0.1.5.tgz?cache=0&sync_timestamp=1635094707880&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fpreset-modules%2Fdownload%2F%40babel%2Fpreset-modules-0.1.5.tgz", - "integrity": "sha1-75Odbn8miCfhhBY43G/5VRXhFdk=", - "dev": true, - "requires": { - "@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/runtime": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/runtime/download/@babel/runtime-7.16.0.tgz?cache=0&sync_timestamp=1635554597219&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.16.0.tgz", - "integrity": "sha1-4nuXfy4giLokdIv5m14d7OZOTws=", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/template/download/@babel/template-7.16.0.tgz", - "integrity": "sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/traverse/download/@babel/traverse-7.16.0.tgz?cache=0&sync_timestamp=1635560939178&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.16.0.tgz", - "integrity": "sha1-ll32xr/AqVjB5zkoTTyfpKbjxFs=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmmirror.com/@babel/types/download/@babel/types-7.16.0.tgz?cache=0&sync_timestamp=1635560939610&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.16.0.tgz", - "integrity": "sha1-2zsxOAT5aq3Qt3bEgj4SetZyibo=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz", - "integrity": "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU=", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz?cache=0&sync_timestamp=1593915150444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fbourne%2Fdownload%2F%40hapi%2Fbourne-1.3.2.tgz", - "integrity": "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo=", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmmirror.com/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz?cache=0&sync_timestamp=1632776440309&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40hapi%2Fhoek%2Fdownload%2F%40hapi%2Fhoek-8.5.1.tgz", - "integrity": "sha1-/elgZMpEbeyMVajC8TCVewcMbgY=", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz?cache=0&sync_timestamp=1603524515155&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fjoi%2Fdownload%2F%40hapi%2Fjoi-15.1.1.tgz", - "integrity": "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc=", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.nlark.com/@hapi/topo/download/@hapi/topo-3.1.6.tgz", - "integrity": "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck=", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@intervolga/optimize-cssnano-plugin": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz", - "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=", - "dev": true, - "requires": { - "cssnano": "^4.0.0", - "cssnano-preset-default": "^4.0.0", - "postcss": "^7.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", - "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&sync_timestamp=1622792705142&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz", - "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", - "dev": true - }, - "@soda/friendly-errors-webpack-plugin": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927399532&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz", - "integrity": "sha1-hHUdgqkwGdXJLAzw5FrFkIfNIkA=", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "error-stack-parser": "^2.0.2", - "string-width": "^2.0.0", - "strip-ansi": "^5" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "@soda/get-current-script": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/@soda/get-current-script/download/@soda/get-current-script-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Fget-current-script%2Fdownload%2F%40soda%2Fget-current-script-1.0.2.tgz", - "integrity": "sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc=", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.nlark.com/@types/body-parser/download/@types/body-parser-1.19.1.tgz", - "integrity": "sha1-DAF0xCp9AXuBgwPUtdlpywt1kpw=", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.nlark.com/@types/connect/download/@types/connect-3.4.35.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fconnect%2Fdownload%2F%40types%2Fconnect-3.4.35.tgz", - "integrity": "sha1-X89q5EXkAh0fwiGaSHPMc6O7KtE=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.nlark.com/@types/connect-history-api-fallback/download/@types/connect-history-api-fallback-1.3.5.tgz?cache=0&sync_timestamp=1629707083783&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fconnect-history-api-fallback%2Fdownload%2F%40types%2Fconnect-history-api-fallback-1.3.5.tgz", - "integrity": "sha1-0feooJ0O1aV67lrpwYq5uAMgXa4=", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.nlark.com/@types/express/download/@types/express-4.17.13.tgz?cache=0&sync_timestamp=1629707789623&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fexpress%2Fdownload%2F%40types%2Fexpress-4.17.13.tgz", - "integrity": "sha1-p24plXKJmbq1GjP6vOHXBaNwkDQ=", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.nlark.com/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.24.tgz", - "integrity": "sha1-6kH5O/fg1ZzVp2ZlBo7WqraBXAc=", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/@types/glob/download/@types/glob-7.2.0.tgz", - "integrity": "sha1-vBtb86qS8lvV3TnzXFc2G9zlsus=", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.nlark.com/@types/http-proxy/download/@types/http-proxy-1.17.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.7.tgz", - "integrity": "sha1-MOqFzCyGg2g1Kjfw0NNYHiSDTG8=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.nlark.com/@types/json-schema/download/@types/json-schema-7.0.9.tgz?cache=0&sync_timestamp=1629708189890&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.9.tgz", - "integrity": "sha1-l+3JA36gw4WFMgsolk3eOznkZg0=", - "dev": true - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.nlark.com/@types/mime/download/@types/mime-1.3.2.tgz?cache=0&sync_timestamp=1629708296476&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fmime%2Fdownload%2F%40types%2Fmime-1.3.2.tgz", - "integrity": "sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o=", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.nlark.com/@types/minimatch/download/@types/minimatch-3.0.5.tgz?cache=0&sync_timestamp=1629708375365&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.5.tgz", - "integrity": "sha1-EAHMXmo3BLg8I2An538vWOoBD0A=", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.nlark.com/@types/minimist/download/@types/minimist-1.2.2.tgz", - "integrity": "sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w=", - "dev": true - }, - "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.6.tgz?cache=0&sync_timestamp=1635213425908&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-16.11.6.tgz", - "integrity": "sha1-a+96KgrWhM9ukPz+Mc7KvZzgo64=", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.nlark.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.1.tgz?cache=0&sync_timestamp=1629708441689&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.1.tgz", - "integrity": "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE=", - "dev": true - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.nlark.com/@types/q/download/@types/q-1.5.5.tgz", - "integrity": "sha1-daKo59irSyMEFFBdkjNdHctTpt8=", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.nlark.com/@types/qs/download/@types/qs-6.9.7.tgz", - "integrity": "sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss=", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.nlark.com/@types/range-parser/download/@types/range-parser-1.2.4.tgz", - "integrity": "sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw=", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.nlark.com/@types/serve-static/download/@types/serve-static-1.13.10.tgz?cache=0&sync_timestamp=1629709187133&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fserve-static%2Fdownload%2F%40types%2Fserve-static-1.13.10.tgz", - "integrity": "sha1-9eDOh5fS18xevtpIpSyWxPpHqNk=", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.nlark.com/@types/source-list-map/download/@types/source-list-map-0.1.2.tgz", - "integrity": "sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk=", - "dev": true - }, - "@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.nlark.com/@types/tapable/download/@types/tapable-1.0.8.tgz?cache=0&sync_timestamp=1629709376833&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Ftapable%2Fdownload%2F%40types%2Ftapable-1.0.8.tgz", - "integrity": "sha1-uUpDkchWZse3Mpn9OtedT6pDUxA=", - "dev": true - }, - "@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.nlark.com/@types/uglify-js/download/@types/uglify-js-3.13.1.tgz", - "integrity": "sha1-XoienoHpQkXHW2RQYA4cXqKHiuo=", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "@types/webpack": { - "version": "4.41.31", - "resolved": "https://registry.nlark.com/@types/webpack/download/@types/webpack-4.41.31.tgz?cache=0&sync_timestamp=1631392314345&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fwebpack%2Fdownload%2F%40types%2Fwebpack-4.41.31.tgz", - "integrity": "sha1-w18lKjVZ3fnIXA2LC0IBkCXlgao=", - "dev": true, - "requires": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "@types/webpack-dev-server": { - "version": "3.11.6", - "resolved": "https://registry.npmmirror.com/@types/webpack-dev-server/download/@types/webpack-dev-server-3.11.6.tgz?cache=0&sync_timestamp=1633721769803&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fwebpack-dev-server%2Fdownload%2F%40types%2Fwebpack-dev-server-3.11.6.tgz", - "integrity": "sha1-2IiM/S8GMCA+E9PteDOk0RuKNNw=", - "dev": true, - "requires": { - "@types/connect-history-api-fallback": "*", - "@types/express": "*", - "@types/serve-static": "*", - "@types/webpack": "^4", - "http-proxy-middleware": "^1.0.0" - } - }, - "@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.nlark.com/@types/webpack-sources/download/@types/webpack-sources-3.2.0.tgz?cache=0&sync_timestamp=1629709718286&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fwebpack-sources%2Fdownload%2F%40types%2Fwebpack-sources-3.2.0.tgz", - "integrity": "sha1-FtdZuglsKJA0smVT0t8b9FJI04s=", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", - "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", - "dev": true - } - } - }, - "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602853295839&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz", - "integrity": "sha1-MWJKelBfsU2h1YAjclpMXycOaoE=", - "dev": true - }, - "@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-transform-on/download/@vue/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha1-m5xpHNBvyFUiGiR1w8yDHXdLx9w=", - "dev": true - }, - "@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/download/@vue/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha1-DFusJ4gNI/iYlM0Daje1XvYd38E=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", - "svg-tags": "^1.0.0" - } - }, - "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.2.1.tgz?cache=0&sync_timestamp=1602853296242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-plugin-transform-vue-jsx%2Fdownload%2F%40vue%2Fbabel-plugin-transform-vue-jsx-1.2.1.tgz", - "integrity": "sha1-ZGBGxlLC8CQnJ/NFGdkXsGQEHtc=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - } - } - }, - "@vue/babel-preset-app": { - "version": "4.5.15", - "resolved": "https://registry.npmmirror.com/@vue/babel-preset-app/download/@vue/babel-preset-app-4.5.15.tgz?cache=0&sync_timestamp=1635486116764&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40vue%2Fbabel-preset-app%2Fdownload%2F%40vue%2Fbabel-preset-app-4.5.15.tgz", - "integrity": "sha1-9rwI+PZ06YomAAQjTN4YuWbXLrA=", - "dev": true, - "requires": { - "@babel/core": "^7.11.0", - "@babel/helper-compilation-targets": "^7.9.6", - "@babel/helper-module-imports": "^7.8.3", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.11.0", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.0", - "@vue/babel-plugin-jsx": "^1.0.3", - "@vue/babel-preset-jsx": "^1.2.4", - "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.6.5", - "core-js-compat": "^3.6.5", - "semver": "^6.1.0" - } - }, - "@vue/babel-preset-jsx": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.2.4.tgz?cache=0&sync_timestamp=1603806795348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-preset-jsx%2Fdownload%2F%40vue%2Fbabel-preset-jsx-1.2.4.tgz", - "integrity": "sha1-kv6nnbbxOwHoDToAmeKSS9y+Toc=", - "dev": true, - "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", - "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", - "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", - "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", - "@vue/babel-sugar-functional-vue": "^1.2.2", - "@vue/babel-sugar-inject-h": "^1.2.2", - "@vue/babel-sugar-v-model": "^1.2.3", - "@vue/babel-sugar-v-on": "^1.2.3" - } - }, - "@vue/babel-sugar-composition-api-inject-h": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-composition-api-inject-h/download/@vue/babel-sugar-composition-api-inject-h-1.2.1.tgz?cache=0&sync_timestamp=1602851469591&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-composition-api-inject-h%2Fdownload%2F%40vue%2Fbabel-sugar-composition-api-inject-h-1.2.1.tgz", - "integrity": "sha1-BdbgxDJxDjdYKyvppgSbaJtvA+s=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-composition-api-render-instance": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-composition-api-render-instance/download/@vue/babel-sugar-composition-api-render-instance-1.2.4.tgz?cache=0&sync_timestamp=1603806885697&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-composition-api-render-instance%2Fdownload%2F%40vue%2Fbabel-sugar-composition-api-render-instance-1.2.4.tgz", - "integrity": "sha1-5MvGmXw0T6wnF4WteikyXFHWjRk=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-functional-vue": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.2.2.tgz", - "integrity": "sha1-JnqayNeHyW7b8Dzj85LEnam9Jlg=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-inject-h": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.2.2.tgz", - "integrity": "sha1-1zjTyJM2fshJHcu2abAAkZKT46o=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-v-model": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.2.3.tgz?cache=0&sync_timestamp=1603182768694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-v-model%2Fdownload%2F%40vue%2Fbabel-sugar-v-model-1.2.3.tgz", - "integrity": "sha1-+h8pulHr8KoabDX6ZtU5vEWaGPI=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", - "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - } - } - }, - "@vue/babel-sugar-v-on": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.2.3.tgz?cache=0&sync_timestamp=1603182070544&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-sugar-v-on%2Fdownload%2F%40vue%2Fbabel-sugar-v-on-1.2.3.tgz", - "integrity": "sha1-NCNnF4WGpp85LwS/ujICHQKROto=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", - "camelcase": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } - } - }, - "@vue/cli-overlay": { - "version": "4.5.15", - "resolved": "https://registry.npmmirror.com/@vue/cli-overlay/download/@vue/cli-overlay-4.5.15.tgz", - "integrity": "sha1-BwD9a605M21Bibo/99JeY46BjJw=", - "dev": true - }, - "@vue/cli-plugin-babel": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-4.5.0.tgz?cache=0&sync_timestamp=1635486116421&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40vue%2Fcli-plugin-babel%2Fdownload%2F%40vue%2Fcli-plugin-babel-4.5.0.tgz", - "integrity": "sha1-AXrpatXErcWrupURDvLE912103A=", - "dev": true, - "requires": { - "@babel/core": "^7.9.6", - "@vue/babel-preset-app": "^4.5.0", - "@vue/cli-shared-utils": "^4.5.0", - "babel-loader": "^8.1.0", - "cache-loader": "^4.1.0", - "thread-loader": "^2.1.3", - "webpack": "^4.0.0" - } - }, - "@vue/cli-plugin-router": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.5.0.tgz", - "integrity": "sha1-bjMKPLyll5TiQ6jEVoHGOH8eX9Q=", - "dev": true, - "requires": { - "@vue/cli-shared-utils": "^4.5.0" - } - }, - "@vue/cli-plugin-vuex": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/download/@vue/cli-plugin-vuex-4.5.0.tgz", - "integrity": "sha1-/6lyt5QFosIagcINdXUuLIMsSNM=", - "dev": true - }, - "@vue/cli-service": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/@vue/cli-service/download/@vue/cli-service-4.5.0.tgz?cache=0&sync_timestamp=1635486199258&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40vue%2Fcli-service%2Fdownload%2F%40vue%2Fcli-service-4.5.0.tgz", - "integrity": "sha1-G94km692HzJ962pzVYzuORHD50w=", - "dev": true, - "requires": { - "@intervolga/optimize-cssnano-plugin": "^1.0.5", - "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@soda/get-current-script": "^1.0.0", - "@types/minimist": "^1.2.0", - "@types/webpack": "^4.0.0", - "@types/webpack-dev-server": "^3.11.0", - "@vue/cli-overlay": "^4.5.0", - "@vue/cli-plugin-router": "^4.5.0", - "@vue/cli-plugin-vuex": "^4.5.0", - "@vue/cli-shared-utils": "^4.5.0", - "@vue/component-compiler-utils": "^3.1.2", - "@vue/preload-webpack-plugin": "^1.1.0", - "@vue/web-component-wrapper": "^1.2.0", - "acorn": "^7.2.0", - "acorn-walk": "^7.1.1", - "address": "^1.1.2", - "autoprefixer": "^9.8.0", - "browserslist": "^4.12.0", - "cache-loader": "^4.1.0", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "cli-highlight": "^2.1.4", - "clipboardy": "^2.3.0", - "cliui": "^6.0.0", - "copy-webpack-plugin": "^5.1.1", - "css-loader": "^3.5.3", - "cssnano": "^4.1.10", - "debug": "^4.1.1", - "default-gateway": "^5.0.5", - "dotenv": "^8.2.0", - "dotenv-expand": "^5.1.0", - "file-loader": "^4.2.0", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "hash-sum": "^2.0.0", - "html-webpack-plugin": "^3.2.0", - "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.1", - "lodash.mapvalues": "^4.6.0", - "lodash.transform": "^4.6.0", - "mini-css-extract-plugin": "^0.9.0", - "minimist": "^1.2.5", - "pnp-webpack-plugin": "^1.6.4", - "portfinder": "^1.0.26", - "postcss-loader": "^3.0.0", - "ssri": "^7.1.0", - "terser-webpack-plugin": "^2.3.6", - "thread-loader": "^2.1.3", - "url-loader": "^2.2.0", - "vue-loader": "^15.9.2", - "vue-loader-v16": "npm:vue-loader@^16.0.0-beta.3", - "vue-style-loader": "^4.1.2", - "webpack": "^4.0.0", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-chain": "^6.4.0", - "webpack-dev-server": "^3.11.0", - "webpack-merge": "^4.2.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1630916591807&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-7.4.1.tgz", - "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", - "dev": true - }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.nlark.com/cacache/download/cacache-13.0.1.tgz", - "integrity": "sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw=", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "ssri": { - "version": "7.1.1", - "resolved": "https://registry.nlark.com/ssri/download/ssri-7.1.1.tgz?cache=0&sync_timestamp=1621364918494&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fssri%2Fdownload%2Fssri-7.1.1.tgz", - "integrity": "sha1-M+RPiWqWcVjjxjRo5H7EZhO5W18=", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "terser-webpack-plugin": { - "version": "2.3.8", - "resolved": "https://registry.nlark.com/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1631202322859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz", - "integrity": "sha1-iUdkoZsHQ/L3BOfCqEjFKDppZyQ=", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.3.1", - "jest-worker": "^25.4.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.6.12", - "webpack-sources": "^1.4.3" - } - } - } - }, - "@vue/cli-shared-utils": { - "version": "4.5.15", - "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/download/@vue/cli-shared-utils-4.5.15.tgz", - "integrity": "sha1-26OFgWXb40ZXVfJWpIkOaQhFMtY=", - "dev": true, - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - } - }, - "@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.3.0.tgz", - "integrity": "sha1-+fX7U0ZLDDeyyNLz+/5E32D2Hck=", - "dev": true, - "requires": { - "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", - "prettier": "^1.18.2 || ^2.0.0", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427573763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "@vue/preload-webpack-plugin": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.2.tgz", - "integrity": "sha1-zrkktOyzucQ4ccekKaAvhCPmIas=", - "dev": true - }, - "@vue/web-component-wrapper": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.3.0.tgz?cache=0&sync_timestamp=1613216912643&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fweb-component-wrapper%2Fdownload%2F%40vue%2Fweb-component-wrapper-1.3.0.tgz", - "integrity": "sha1-trQKdiVCnSvXwigd26YB7QXcfxo=", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz?cache=0&sync_timestamp=1625473368618&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fast%2Fdownload%2F%40webassemblyjs%2Fast-1.9.0.tgz", - "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q=", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz?cache=0&sync_timestamp=1625473460936&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-api-error%2Fdownload%2F%40webassemblyjs%2Fhelper-api-error-1.9.0.tgz", - "integrity": "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI=", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz?cache=0&sync_timestamp=1625473462686&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-buffer%2Fdownload%2F%40webassemblyjs%2Fhelper-buffer-1.9.0.tgz", - "integrity": "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA=", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz?cache=0&sync_timestamp=1625473420790&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.9.0.tgz", - "integrity": "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc=", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz?cache=0&sync_timestamp=1625473415428&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fhelper-fsm%2Fdownload%2F%40webassemblyjs%2Fhelper-fsm-1.9.0.tgz", - "integrity": "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg=", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz", - "integrity": "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A=", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz", - "integrity": "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz?cache=0&sync_timestamp=1625473454591&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fieee754%2Fdownload%2F%40webassemblyjs%2Fieee754-1.9.0.tgz", - "integrity": "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ=", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz?cache=0&sync_timestamp=1625473456730&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fleb128%2Fdownload%2F%40webassemblyjs%2Fleb128-1.9.0.tgz", - "integrity": "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU=", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz?cache=0&sync_timestamp=1625473454967&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Futf8%2Fdownload%2F%40webassemblyjs%2Futf8-1.9.0.tgz", - "integrity": "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas=", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz", - "integrity": "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz", - "integrity": "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz", - "integrity": "sha1-IhEYHlsxMmRDzIES658LkChyGmE=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz?cache=0&sync_timestamp=1625473358573&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40webassemblyjs%2Fwasm-parser%2Fdownload%2F%40webassemblyjs%2Fwasm-parser-1.9.0.tgz", - "integrity": "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz", - "integrity": "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.nlark.com/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz", - "integrity": "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", - "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", - "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.nlark.com/acorn/download/acorn-6.4.2.tgz?cache=0&sync_timestamp=1630916591807&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-6.4.2.tgz", - "integrity": "sha1-NYZv1xBSjpLeEM8GAWSY5H454eY=", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.nlark.com/acorn-walk/download/acorn-walk-7.2.0.tgz?cache=0&sync_timestamp=1630916588767&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-7.2.0.tgz", - "integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w=", - "dev": true - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz", - "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz", - "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo=", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1631470912358&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", - "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", - "dev": true, - "requires": { - "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-errors": { - "version": "1.0.1", - "resolved": "https://registry.nlark.com/ajv-errors/download/ajv-errors-1.0.1.tgz", - "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1616882351228&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", - "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", - "dev": true - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz", - "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-3.1.2.tgz", - "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", - "dev": true - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/arch/download/arch-2.2.0.tgz?cache=0&sync_timestamp=1603836304953&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farch%2Fdownload%2Farch-2.2.0.tgz", - "integrity": "sha1-G8R4GPMFdk8jqzMGsL/AhsWinRE=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.nlark.com/array-uniq/download/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-5.4.1.tgz", - "integrity": "sha1-EamAuE67kXgc41sP3C7ilON4Pwc=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", - "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", - "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.nlark.com/util/download/util-0.10.3.tgz?cache=0&sync_timestamp=1622213272480&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmmirror.com/async/download/async-2.6.3.tgz?cache=0&sync_timestamp=1635441306043&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fasync%2Fdownload%2Fasync-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", - "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz", - "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", - "dev": true - }, - "async-validator": { - "version": "1.8.5", - "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz", - "integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=", - "requires": { - "babel-runtime": "6.x" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", - "dev": true - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmmirror.com/autoprefixer/download/autoprefixer-9.8.8.tgz?cache=0&sync_timestamp=1635421245353&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fautoprefixer%2Fdownload%2Fautoprefixer-9.8.8.tgz", - "integrity": "sha1-/UvUWVOF+m8GWZ3nSaTV96R0lXo=", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", - "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", - "dev": true - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.11.0.tgz?cache=0&sync_timestamp=1604101421225&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.11.0.tgz", - "integrity": "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk=", - "dev": true - }, - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmmirror.com/axios/download/axios-0.24.0.tgz", - "integrity": "sha1-gE5voeS5xSiFAd2d/1anoJQNINY=", - "requires": { - "follow-redirects": "^1.14.4" - }, - "dependencies": { - "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.4.tgz?cache=0&sync_timestamp=1631622206750&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.4.tgz", - "integrity": "sha1-g4/fSKi73XnlLuUfsclOPtmLk3k=" - } - } - }, - "babel-helper-vue-jsx-merge-props": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz", - "integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY=" - }, - "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmmirror.com/babel-loader/download/babel-loader-8.2.3.tgz?cache=0&sync_timestamp=1634769717079&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.3.tgz", - "integrity": "sha1-iYa0Dxpkys/LS4QpMgCF72ixNC0=", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.3.tgz?cache=0&sync_timestamp=1635567015530&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha1-btjjCYGwYvj+asqIc6N+vMjMHA8=", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.3.0.tgz?cache=0&sync_timestamp=1635567014842&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-corejs3%2Fdownload%2Fbabel-plugin-polyfill-corejs3-0.3.0.tgz", - "integrity": "sha1-+nyj0e6d3GGTYA/7YyyXhdVJGK8=", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4", - "core-js-compat": "^3.18.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.2.3.tgz?cache=0&sync_timestamp=1635567014990&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-polyfill-regenerator%2Fdownload%2Fbabel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha1-LpgI9QJ8QzbJlJkrSKQmJYDLjW0=", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz", - "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" - } - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz", - "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz", - "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz", - "integrity": "sha1-MlyGGoIryzWKQceKM7jm4ght3n8=", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", - "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz", - "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", - "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", - "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.2.0.tgz", - "integrity": "sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz", - "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010785257&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", - "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.1.0.tgz", - "integrity": "sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0=", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.2.1.tgz?cache=0&sync_timestamp=1596557838450&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserify-sign%2Fdownload%2Fbrowserify-sign-4.2.1.tgz", - "integrity": "sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM=", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmmirror.com/browserslist/download/browserslist-4.17.5.tgz?cache=0&sync_timestamp=1635094562535&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.17.5.tgz", - "integrity": "sha1-yCe74XKkwisSP14zdTPO66391Vk=", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz", - "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/buffer-from/download/buffer-from-1.1.2.tgz", - "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", - "dev": true - }, - "buffer-json": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/buffer-json/download/buffer-json-2.0.0.tgz", - "integrity": "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.nlark.com/cacache/download/cacache-12.0.4.tgz", - "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-loader": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-4.1.0.tgz", - "integrity": "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4=", - "dev": true, - "requires": { - "buffer-json": "^2.0.0", - "find-cache-dir": "^3.0.0", - "loader-utils": "^1.2.3", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "schema-utils": "^2.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.2.tgz?cache=0&sync_timestamp=1610403007655&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcall-bind%2Fdownload%2Fcall-bind-1.0.2.tgz", - "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/caller-callsite/download/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/caller-path/download/caller-path-2.0.0.tgz?cache=0&sync_timestamp=1633674116889&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcaller-path%2Fdownload%2Fcaller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/callsites/download/callsites-2.0.0.tgz?cache=0&sync_timestamp=1628464722297&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcallsites%2Fdownload%2Fcallsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.2.0.tgz", - "integrity": "sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk=", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", - "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001274", - "resolved": "https://registry.npmmirror.com/caniuse-lite/download/caniuse-lite-1.0.30001274.tgz", - "integrity": "sha1-Jso2IE0VsXYBum/DXb2tlQpkfMc=", - "dev": true - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.4.0.tgz?cache=0&sync_timestamp=1614018570698&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcase-sensitive-paths-webpack-plugin%2Fdownload%2Fcase-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha1-22QGbGQi7tLgjMFLmGykN5bbxtQ=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687076871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-8.0.3.tgz", - "integrity": "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI=", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.nlark.com/chokidar/download/chokidar-3.5.2.tgz", - "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.nlark.com/chrome-trace-event/download/chrome-trace-event-1.0.3.tgz", - "integrity": "sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmmirror.com/clean-css/download/clean-css-4.2.4.tgz?cache=0&sync_timestamp=1634992314911&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fclean-css%2Fdownload%2Fclean-css-4.2.4.tgz", - "integrity": "sha1-czv0brpOYHxokepXwkqYk1aDEXg=", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1621915066376&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz", - "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/cli-cursor/download/cli-cursor-2.1.0.tgz?cache=0&sync_timestamp=1629747506749&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcli-cursor%2Fdownload%2Fcli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.11.tgz?cache=0&sync_timestamp=1616955654193&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-highlight%2Fdownload%2Fcli-highlight-2.1.11.tgz", - "integrity": "sha1-SXNvpFLwqvT65YDjCssmgo0twb8=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", - "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmmirror.com/highlight.js/download/highlight.js-10.7.3.tgz", - "integrity": "sha1-aXJy45kTVuQMPKxWanTu9oF1ZTE=", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", - "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmmirror.com/cli-spinners/download/cli-spinners-2.6.1.tgz?cache=0&sync_timestamp=1633109609172&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.6.1.tgz", - "integrity": "sha1-rclU6+KBw3pjGb+kAebdJIj/tw0=", - "dev": true - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/clipboardy/download/clipboardy-2.3.0.tgz", - "integrity": "sha1-PCkDZQxo5GqRs4iYW8J3QofbopA=", - "dev": true, - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz", - "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz?cache=0&sync_timestamp=1604880267387&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-6.0.0.tgz", - "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-4.2.3.tgz", - "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-6.2.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-6.2.0.tgz", - "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/clone-deep/download/clone-deep-4.0.1.tgz", - "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", - "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.nlark.com/color/download/color-3.2.1.tgz?cache=0&sync_timestamp=1628104117021&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcolor%2Fdownload%2Fcolor-3.2.1.tgz", - "integrity": "sha1-NUTcGYyvRJDD7MmnkLVP6f9F4WQ=", - "dev": true, - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.6.0", - "resolved": "https://registry.nlark.com/color-string/download/color-string-1.6.0.tgz", - "integrity": "sha1-w5FfYf4mdnLLfh4GTJ1pIhn2wxI=", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", - "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", - "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", - "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", - "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz?cache=0&sync_timestamp=1599596654038&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.15.1.tgz", - "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz?cache=0&sync_timestamp=1624045508580&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.8.0.tgz", - "integrity": "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "5.1.2", - "resolved": "https://registry.nlark.com/copy-webpack-plugin/download/copy-webpack-plugin-5.1.2.tgz?cache=0&sync_timestamp=1624628458516&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcopy-webpack-plugin%2Fdownload%2Fcopy-webpack-plugin-5.1.2.tgz", - "integrity": "sha1-ioieHcr6bJHGzUvhrRWPHTgjuuI=", - "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz", - "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.nlark.com/globby/download/globby-7.1.1.tgz?cache=0&sync_timestamp=1629801109090&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobby%2Fdownload%2Fglobby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", - "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz?cache=0&sync_timestamp=1628765027018&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.5.tgz", - "integrity": "sha1-c5XcJzrzf7LlDpvT2f6EEoUjHRo=" - }, - "core-js-compat": { - "version": "3.19.0", - "resolved": "https://registry.npmmirror.com/core-js-compat/download/core-js-compat-3.19.0.tgz", - "integrity": "sha1-s7k/k8hyGz7VK5HxL5ZMxBCWf4s=", - "dev": true, - "requires": { - "browserslist": "^4.17.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz", - "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.nlark.com/cosmiconfig/download/cosmiconfig-5.2.1.tgz", - "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1610966646988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz", - "integrity": "sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", - "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/css-loader/download/css-loader-3.6.0.tgz", - "integrity": "sha1-Lkssfm4tJ/jI8o9hv/zS5ske9kU=", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-2.1.0.tgz", - "integrity": "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8=", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", - "dev": true - }, - "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.28.tgz?cache=0&sync_timestamp=1617191696722&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-tree%2Fdownload%2Fcss-tree-1.0.0-alpha.28.tgz", - "integrity": "sha1-joloGQ2IbJR3vI1h6W9hrz9/+n8=", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/css-url-regex/download/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmmirror.com/css-what/download/css-what-3.4.2.tgz", - "integrity": "sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ=", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", - "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", - "dev": true - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npm.taobao.org/cssfilter/download/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" - }, - "cssnano": { - "version": "4.1.11", - "resolved": "https://registry.nlark.com/cssnano/download/cssnano-4.1.11.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssnano%2Fdownload%2Fcssnano-4.1.11.tgz", - "integrity": "sha1-x7X1uB2iacsf2YLLlgwSAJEMmpk=", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.nlark.com/cssnano-preset-default/download/cssnano-preset-default-4.0.8.tgz?cache=0&sync_timestamp=1629280581668&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcssnano-preset-default%2Fdownload%2Fcssnano-preset-default-4.0.8.tgz", - "integrity": "sha1-kgYisfwelaNOiDggPxOXpQTy0/8=", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", - "dev": true - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npm.taobao.org/csso/download/csso-3.5.1.tgz?cache=0&sync_timestamp=1606408777341&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsso%2Fdownload%2Fcsso-3.5.1.tgz", - "integrity": "sha1-e564vmFiiXPBsmHhadLwJACOdYs=", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.29.tgz?cache=0&sync_timestamp=1617191696722&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-tree%2Fdownload%2Fcss-tree-1.0.0-alpha.29.tgz", - "integrity": "sha1-P6nU7zFCy9HDAedmTB81K9gvWjk=", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - } - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz?cache=0&sync_timestamp=1601073381998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdashdash%2Fdownload%2Fdashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz", - "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1633055756574&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz?cache=0&sync_timestamp=1606859943631&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeep-equal%2Fdownload%2Fdeep-equal-1.1.1.tgz", - "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz", - "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=" - }, - "default-gateway": { - "version": "5.0.5", - "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-5.0.5.tgz?cache=0&sync_timestamp=1610365825693&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-5.0.5.tgz", - "integrity": "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA=", - "dev": true, - "requires": { - "execa": "^3.3.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", - "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.nlark.com/execa/download/execa-3.4.0.tgz", - "integrity": "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k=", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.nlark.com/get-stream/download/get-stream-5.2.0.tgz", - "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.nlark.com/is-stream/download/is-stream-2.0.1.tgz?cache=0&sync_timestamp=1628592856164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-stream%2Fdownload%2Fis-stream-2.0.1.tgz", - "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/mimic-fn/download/mimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-4.0.1.tgz?cache=0&sync_timestamp=1633420566316&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-4.0.1.tgz", - "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.2.tgz", - "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz", - "integrity": "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971632960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz", - "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", - "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz?cache=0&sync_timestamp=1628896304371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-3.0.0.tgz", - "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", - "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz?cache=0&sync_timestamp=1601076936089&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdel%2Fdownload%2Fdel-4.1.1.tgz", - "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.nlark.com/globby/download/globby-6.1.0.tgz?cache=0&sync_timestamp=1629801109090&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobby%2Fdownload%2Fglobby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/p-map/download/p-map-2.1.0.tgz?cache=0&sync_timestamp=1635321371446&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-map%2Fdownload%2Fp-map-2.1.0.tgz", - "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", - "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/detect-node/download/detect-node-2.1.0.tgz", - "integrity": "sha1-yccHdaScPQO8LAbZpzvlUPl4+LE=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", - "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", - "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.nlark.com/dns-packet/download/dns-packet-1.3.4.tgz", - "integrity": "sha1-40VQZYJKJQe6iGxVqJljuxB97G8=", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", - "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz", - "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/domelementtype/download/domelementtype-2.2.0.tgz", - "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.nlark.com/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1627591557212&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", - "dev": true - }, - "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.nlark.com/domhandler/download/domhandler-4.2.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-4.2.2.tgz", - "integrity": "sha1-6CXXIdGahrjCAaNSZOImxnjudV8=", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/domelementtype/download/domelementtype-2.2.0.tgz", - "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", - "dev": true - } - } - }, - "domready": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/domready/download/domready-1.0.8.tgz", - "integrity": "sha1-kfJS5Ze2Wvd+dFriTdAYXV4m1Yw=", - "dev": true - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.3.0.tgz?cache=0&sync_timestamp=1605778226941&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.3.0.tgz", - "integrity": "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.nlark.com/dotenv/download/dotenv-8.6.0.tgz?cache=0&sync_timestamp=1621628681571&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv%2Fdownload%2Fdotenv-8.6.0.tgz", - "integrity": "sha1-Bhr2ZNGff02PxuT/m1hM4jety4s=", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz", - "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=", - "dev": true - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz?cache=0&sync_timestamp=1597220926027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fduplexer%2Fdownload%2Fduplexer-0.1.2.tgz", - "integrity": "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.nlark.com/duplexify/download/duplexify-3.7.1.tgz?cache=0&sync_timestamp=1626860849590&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fduplexify%2Fdownload%2Fduplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "easy-stack": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.1.tgz", - "integrity": "sha1-iv5CZGJpiMq7EfPHBMzQyDVBEGY=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "echarts": { - "version": "4.9.0", - "resolved": "https://registry.npm.taobao.org/echarts/download/echarts-4.9.0.tgz?cache=0&sync_timestamp=1598588132435&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fecharts%2Fdownload%2Fecharts-4.9.0.tgz", - "integrity": "sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0=", - "requires": { - "zrender": "4.3.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz?cache=0&sync_timestamp=1612643435705&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fejs%2Fdownload%2Fejs-2.7.4.tgz", - "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.886", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.3.886.tgz?cache=0&sync_timestamp=1635822719687&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.886.tgz", - "integrity": "sha1-rAOcQAG2ZbHdDw7ZwuTakP88kmc=", - "dev": true - }, - "element-ui": { - "version": "2.13.2", - "resolved": "https://registry.npm.taobao.org/element-ui/download/element-ui-2.13.2.tgz?cache=0&sync_timestamp=1589795164194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felement-ui%2Fdownload%2Felement-ui-2.13.2.tgz", - "integrity": "sha1-WCv0eqqqr+I+oZWPriF6aHrQZEc=", - "requires": { - "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" - } - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.4.tgz?cache=0&sync_timestamp=1612290637117&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.4.tgz", - "integrity": "sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s=", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", - "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", - "dev": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", - "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", - "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.nlark.com/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz", - "integrity": "sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz", - "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/entities/download/entities-2.2.0.tgz", - "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.8.tgz", - "integrity": "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz", - "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/es-abstract/download/es-abstract-1.19.1.tgz?cache=0&sync_timestamp=1633234313248&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.19.1.tgz", - "integrity": "sha1-1IhXlodpFpWd547aoN9FZicRXsM=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567334507&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz", - "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/eslint-scope/download/eslint-scope-4.0.3.tgz", - "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz", - "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-5.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-5.3.0.tgz", - "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1635237716974&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz?cache=0&sync_timestamp=1606361604403&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevent-pubsub%2Fdownload%2Fevent-pubsub-4.3.0.tgz", - "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.7.tgz?cache=0&sync_timestamp=1598517795415&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-4.0.7.tgz", - "integrity": "sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/events/download/events-3.3.0.tgz", - "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA=", - "dev": true - }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.nlark.com/eventsource/download/eventsource-1.1.0.tgz", - "integrity": "sha1-AOjKfJIQnpSw3fMtrGd9hBAoz68=", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/execa/download/execa-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", - "dev": true, - "requires": { - "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" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599651635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.nlark.com/fast-glob/download/fast-glob-2.2.7.tgz?cache=0&sync_timestamp=1625773305786&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffast-glob%2Fdownload%2Ffast-glob-2.2.7.tgz", - "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.nlark.com/faye-websocket/download/faye-websocket-0.11.4.tgz", - "integrity": "sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz", - "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=", - "dev": true - }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-4.3.0.tgz?cache=0&sync_timestamp=1603817159481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-loader%2Fdownload%2Ffile-loader-4.3.0.tgz", - "integrity": "sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8=", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", - "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", - "dev": true, - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/filesize/download/filesize-3.6.1.tgz?cache=0&sync_timestamp=1635763993879&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffilesize%2Fdownload%2Ffilesize-3.6.1.tgz", - "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-3.3.2.tgz", - "integrity": "sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.4.tgz?cache=0&sync_timestamp=1631622206750&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.4.tgz", - "integrity": "sha1-g4/fSKi73XnlLuUfsclOPtmLk3k=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503499867&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz", - "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-7.0.1.tgz", - "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz", - "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612537044236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz", - "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz", - "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.1.1.tgz?cache=0&sync_timestamp=1612364352840&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-intrinsic%2Fdownload%2Fget-intrinsic-1.1.1.tgz", - "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.nlark.com/get-stream/download/get-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz", - "integrity": "sha1-f9uByQAQH71WTdXxowr1qtweWNY=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz?cache=0&sync_timestamp=1632354209679&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob%2Fdownload%2Fglob-7.2.0.tgz", - "integrity": "sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", - "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1635390798667&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", - "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", - "dev": true - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.nlark.com/globby/download/globby-9.2.0.tgz?cache=0&sync_timestamp=1629801109090&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobby%2Fdownload%2Fglobby-9.2.0.tgz", - "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", - "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.8.tgz", - "integrity": "sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo=", - "dev": true - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz?cache=0&sync_timestamp=1605523115814&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgzip-size%2Fdownload%2Fgzip-size-5.1.1.tgz", - "integrity": "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ=", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz", - "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz?cache=0&sync_timestamp=1596082653557&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhar-validator%2Fdownload%2Fhar-validator-5.1.5.tgz", - "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz?cache=0&sync_timestamp=1615461262702&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-bigints%2Fdownload%2Fhas-bigints-1.0.1.tgz", - "integrity": "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz?cache=0&sync_timestamp=1614443577352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.2.tgz", - "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz?cache=0&sync_timestamp=1628197490246&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-tostringtag%2Fdownload%2Fhas-tostringtag-1.0.0.tgz", - "integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.1.0.tgz", - "integrity": "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM=", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - } - } - }, - "hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz", - "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", - "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz", - "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", - "dev": true - }, - "highlight.js": { - "version": "9.18.5", - "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.5.tgz", - "integrity": "sha1-0Yo1mGfzeME41oGe38KorNXymCU=" - }, - "highlight.js-async-webpack": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/highlight.js-async-webpack/download/highlight.js-async-webpack-1.0.4.tgz", - "integrity": "sha1-wGtnv5nwSQRdYrdW5YVbCRLsYWw=" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz", - "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.9.tgz?cache=0&sync_timestamp=1617826545071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.9.tgz", - "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.4.0.tgz?cache=0&sync_timestamp=1617031468383&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-entities%2Fdownload%2Fhtml-entities-1.4.0.tgz", - "integrity": "sha1-z70bAdKvr5rcobEK59/6uYxx0tw=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", - "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", - "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", - "dev": true - } - } - }, - "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz", - "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=", - "dev": true - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz", - "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.nlark.com/htmlparser2/download/htmlparser2-6.1.0.tgz", - "integrity": "sha1-xNditsM3GgXb5l6UrkOp+EX7j7c=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz", - "integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/domelementtype/download/domelementtype-2.2.0.tgz", - "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", - "dev": true - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz", - "integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407676624&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.5.3.tgz", - "integrity": "sha1-AdJwnHnUFpi7AdTezF6dpOSgM9k=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz", - "integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "1.3.1", - "resolved": "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-1.3.1.tgz", - "integrity": "sha1-Q3ANbZ7st0Gb8IahKND3IF2etmU=", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.5", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.nlark.com/micromatch/download/micromatch-4.0.4.tgz", - "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1600868483922&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.nlark.com/human-signals/download/human-signals-1.1.1.tgz", - "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz?cache=0&sync_timestamp=1605801291394&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-4.1.1.tgz", - "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.2.1.tgz", - "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz", - "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz?cache=0&sync_timestamp=1618422657851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimage-size%2Fdownload%2Fimage-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1608469485280&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/import-from/download/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/import-local/download/import-local-2.0.0.tgz", - "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz?cache=0&sync_timestamp=1628765027018&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz?cache=0&sync_timestamp=1618679442183&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Findent-string%2Fdownload%2Findent-string-4.0.0.tgz", - "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", - "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/internal-ip/download/internal-ip-4.3.0.tgz", - "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "dependencies": { - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz?cache=0&sync_timestamp=1610365825693&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-4.2.0.tgz", - "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - } - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/internal-slot/download/internal-slot-1.0.3.tgz", - "integrity": "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz?cache=0&sync_timestamp=1611327032630&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fip-regex%2Fdownload%2Fip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.nlark.com/is-arguments/download/is-arguments-1.1.1.tgz?cache=0&sync_timestamp=1628202102318&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-arguments%2Fdownload%2Fis-arguments-1.1.1.tgz", - "integrity": "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz", - "integrity": "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz?cache=0&sync_timestamp=1628207133571&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-boolean-object%2Fdownload%2Fis-boolean-object-1.1.2.tgz", - "integrity": "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz?cache=0&sync_timestamp=1628259683451&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-callable%2Fdownload%2Fis-callable-1.2.4.tgz", - "integrity": "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/is-core-module/download/is-core-module-2.8.0.tgz?cache=0&sync_timestamp=1634237061095&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.8.0.tgz", - "integrity": "sha1-AyEzbD0JJeSX/Zf12VyxFKXM1Ug=", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz", - "integrity": "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.nlark.com/is-docker/download/is-docker-2.2.1.tgz?cache=0&sync_timestamp=1630451108035&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-docker%2Fdownload%2Fis-docker-2.2.1.tgz", - "integrity": "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz", - "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.1.tgz?cache=0&sync_timestamp=1607123080624&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-negative-zero%2Fdownload%2Fis-negative-zero-2.0.1.tgz", - "integrity": "sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz", - "integrity": "sha1-anqvg4x/BoalC0VT9+VKlklOifA=", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz", - "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/is-path-cwd/download/is-path-cwd-2.2.0.tgz", - "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz?cache=0&sync_timestamp=1620047389319&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-in-cwd%2Fdownload%2Fis-path-in-cwd-2.1.0.tgz", - "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-2.1.0.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-2.1.0.tgz", - "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-3.0.0.tgz?cache=0&sync_timestamp=1618601044820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-3.0.0.tgz", - "integrity": "sha1-r28uoUrFpkYYOlu9tbqrvBVq2dc=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz?cache=0&sync_timestamp=1593243670545&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-object%2Fdownload%2Fis-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz", - "integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha1-l7DIX72stZycRG/mU7gs8rW3z+Y=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.nlark.com/is-stream/download/is-stream-1.1.0.tgz?cache=0&sync_timestamp=1628592856164&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-stream%2Fdownload%2Fis-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz", - "integrity": "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501308896&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz", - "integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.nlark.com/is-weakref/download/is-weakref-1.0.1.tgz", - "integrity": "sha1-hC26TsF/qayYUN8tbvvBc3J08qI=", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "javascript-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-2.1.0.tgz", - "integrity": "sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk=", - "dev": true - }, - "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmmirror.com/jest-worker/download/jest-worker-25.5.0.tgz?cache=0&sync_timestamp=1634626706503&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjest-worker%2Fdownload%2Fjest-worker-25.5.0.tgz", - "integrity": "sha1-JhHQcbec6g9D7lej0RhZOsFUfbE=", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", - "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz", - "integrity": "sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ=", - "dev": true - }, - "js-message": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.7.tgz", - "integrity": "sha1-+93QU8ekcCGHG7iyyVOXzBfCDkc=", - "dev": true - }, - "js-queue": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.2.tgz", - "integrity": "sha1-C+WQM4+QOzbHPTPDGIOoIUEs1II=", - "dev": true, - "requires": { - "easy-stack": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz?cache=0&sync_timestamp=1618434911653&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.1.tgz", - "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603892968504&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", - "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz?cache=0&sync_timestamp=1599064788298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-parse-even-better-errors%2Fdownload%2Fjson-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz?cache=0&sync_timestamp=1609553637722&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema%2Fdownload%2Fjson-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", - "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-2.2.0.tgz", - "integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604164898625&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", - "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - }, - "launch-editor": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz", - "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "shell-quote": "^1.6.1" - } - }, - "launch-editor-middleware": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz", - "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=", - "dev": true, - "requires": { - "launch-editor": "^2.2.1" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1610027918622&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz", - "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", - "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.nlark.com/locate-path/download/locate-path-5.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.19.tgz", - "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.transform": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", - "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.7.1.tgz?cache=0&sync_timestamp=1606314074355&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floglevel%2Fdownload%2Floglevel-1.7.1.tgz", - "integrity": "sha1-AF/eL15uRwaPk1/yhXPhJe9y8Zc=", - "dev": true - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz?cache=0&sync_timestamp=1594427573763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-5.1.1.tgz", - "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", - "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "mavon-editor": { - "version": "2.9.1", - "resolved": "https://registry.npm.taobao.org/mavon-editor/download/mavon-editor-2.9.1.tgz", - "integrity": "sha1-Wa3Hy9Ghpx9pHPWyon5g7D5pl8w=", - "requires": { - "highlight.js": "^9.11.0", - "highlight.js-async-webpack": "^1.0.4", - "xss": "^1.0.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", - "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.nlark.com/mdn-data/download/mdn-data-1.1.4.tgz?cache=0&sync_timestamp=1631835926316&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmdn-data%2Fdownload%2Fmdn-data-1.1.4.tgz", - "integrity": "sha1-ULXU/8RXUnZXPE7tuHgIEqhBnwE=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-options": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/merge-options/download/merge-options-1.0.1.tgz", - "integrity": "sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=", - "dev": true, - "requires": { - "is-plain-obj": "^1.1" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618601044820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", - "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", - "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.nlark.com/micromatch/download/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", - "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", - "dev": true - } - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.5.2.tgz", - "integrity": "sha1-bj3GzCuVEGQ4MOXxnVy3U9pe6r4=", - "dev": true - }, - "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.nlark.com/mime-db/download/mime-db-1.50.0.tgz?cache=0&sync_timestamp=1631863111146&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmime-db%2Fdownload%2Fmime-db-1.50.0.tgz", - "integrity": "sha1-q9SslOmNPA4YUBbGerRdX95AwR8=", - "dev": true - }, - "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.33.tgz?cache=0&sync_timestamp=1633108258894&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.33.tgz", - "integrity": "sha1-H6EqkERy+v0GjkjZ6EAfdNP3Dts=", - "dev": true, - "requires": { - "mime-db": "1.50.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.nlark.com/mimic-fn/download/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1634872340046&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true - }, - "minipass": { - "version": "3.1.5", - "resolved": "https://registry.nlark.com/minipass/download/minipass-3.1.5.tgz?cache=0&sync_timestamp=1631656107998&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminipass%2Fdownload%2Fminipass-3.1.5.tgz", - "integrity": "sha1-cfYlGwozpJwBs8+X/3ftoDDf9zI=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", - "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz", - "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz", - "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.4.tgz?cache=0&sync_timestamp=1595998531778&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass-pipeline%2Fdownload%2Fminipass-pipeline-1.2.4.tgz", - "integrity": "sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", - "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mitt": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/mitt/download/mitt-1.1.2.tgz", - "integrity": "sha1-OA5hSA1qYVtmDwertg1R4KTkvtY=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", - "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "moment": { - "version": "2.27.0", - "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.27.0.tgz", - "integrity": "sha1-i/9OPiaiNiIN/j423nVrbrqgEF0=" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/multicast-dns/download/multicast-dns-6.2.3.tgz?cache=0&sync_timestamp=1633354821467&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmulticast-dns%2Fdownload%2Fmulticast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz", - "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.nlark.com/nan/download/nan-2.15.0.tgz?cache=0&sync_timestamp=1628093719696&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnan%2Fdownload%2Fnan-2.15.0.tgz", - "integrity": "sha1-PzSkc/8Y4VwbVia2KQO1rW5mX+4=", - "dev": true, - "optional": true - }, - "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmmirror.com/nanoid/download/nanoid-3.1.30.tgz?cache=0&sync_timestamp=1634166241996&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnanoid%2Fdownload%2Fnanoid-3.1.30.tgz", - "integrity": "sha1-Y/k8xUjSoRPcXfvGO/oJ4rm2Q2I=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz?cache=0&sync_timestamp=1594317361810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.2.tgz", - "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.10.0.tgz?cache=0&sync_timestamp=1599010730714&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.10.0.tgz", - "integrity": "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=", - "dev": true - }, - "node-ipc": { - "version": "9.2.1", - "resolved": "https://registry.nlark.com/node-ipc/download/node-ipc-9.2.1.tgz?cache=0&sync_timestamp=1631753729145&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-ipc%2Fdownload%2Fnode-ipc-9.2.1.tgz", - "integrity": "sha1-sy9mEV+dbOhB3E7CAJ1qcz+Yu2s=", - "dev": true, - "requires": { - "event-pubsub": "4.3.0", - "js-message": "1.0.7", - "js-queue": "2.0.2" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", - "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/node-releases/download/node-releases-2.0.1.tgz?cache=0&sync_timestamp=1634806914912&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-2.0.1.tgz", - "integrity": "sha1-PR05XyBPHy8ppUNYuftnh2WtL8U=", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.nlark.com/normalize-package-data/download/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-3.3.0.tgz", - "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", - "dev": true - }, - "normalize-wheel": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz", - "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=" - }, - "normalize.css": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/normalize.css/download/normalize.css-7.0.0.tgz", - "integrity": "sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/npm-run-path/download/npm-run-path-2.0.2.tgz?cache=0&sync_timestamp=1633420566316&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/nprogress/download/nprogress-0.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnprogress%2Fdownload%2Fnprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.nlark.com/object-inspect/download/object-inspect-1.11.0.tgz", - "integrity": "sha1-nc6xRs7dQUig2eUauI00z1CZIrE=", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.5.tgz?cache=0&sync_timestamp=1613858420069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.5.tgz", - "integrity": "sha1-ud7qpfx/GEag+uzc7sE45XePU6w=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115085770&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz", - "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.3.tgz?cache=0&sync_timestamp=1633321702182&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha1-siPPOOF/77l6Y8EMkd9yzLOG354=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmmirror.com/object.values/download/object.values-1.1.5.tgz?cache=0&sync_timestamp=1633326983597&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject.values%2Fdownload%2Fobject.values-1.1.5.tgz", - "integrity": "sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", - "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/open/download/open-6.4.0.tgz", - "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz?cache=0&sync_timestamp=1598733439329&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopener%2Fdownload%2Fopener-1.5.2.tgz", - "integrity": "sha1-XTfh81B3udysQwE3InGv3rKhNZg=", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", - "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.nlark.com/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1631556658795&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fora%2Fdownload%2Fora-3.4.0.tgz", - "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wc^1.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", - "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.nlark.com/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1628812766275&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.nlark.com/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/p-map/download/p-map-3.0.0.tgz?cache=0&sync_timestamp=1635321371446&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-map%2Fdownload%2Fp-map-3.0.0.tgz", - "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50=", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.nlark.com/p-retry/download/p-retry-3.0.1.tgz", - "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/p-try/download/p-try-2.2.0.tgz?cache=0&sync_timestamp=1633364600466&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fp-try%2Fdownload%2Fp-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.nlark.com/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1627560187062&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpako%2Fdownload%2Fpako-1.0.11.tgz", - "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", - "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz?cache=0&sync_timestamp=1597167309380&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-asn1%2Fdownload%2Fparse-asn1-5.1.6.tgz", - "integrity": "sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ=", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.2.0.tgz?cache=0&sync_timestamp=1610966646988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-5.2.0.tgz", - "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=", - "dev": true, - "requires": { - "@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": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz?cache=0&sync_timestamp=1595849246963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5%2Fdownload%2Fparse5-5.1.1.tgz", - "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-6.0.1.tgz?cache=0&sync_timestamp=1596089876753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5-htmlparser2-tree-adapter%2Fdownload%2Fparse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha1-LN+a2CMyEUA3DU2/XT6Sx8jdxuY=", - "dev": true, - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-6.0.1.tgz?cache=0&sync_timestamp=1595849246963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5%2Fdownload%2Fparse5-6.0.1.tgz", - "integrity": "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws=", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", - "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.nlark.com/path-exists/download/path-exists-4.0.0.tgz?cache=0&sync_timestamp=1628765027018&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz?cache=0&sync_timestamp=1617971632960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz?cache=0&sync_timestamp=1621947783503&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-parse%2Fdownload%2Fpath-parse-1.0.7.tgz", - "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1601400247487&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz?cache=0&sync_timestamp=1611752015315&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-type%2Fdownload%2Fpath-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.nlark.com/pbkdf2/download/pbkdf2-3.1.2.tgz", - "integrity": "sha1-3YIqoIh1gOUvGgOdw+2hCO+uMHU=", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-1.0.0.tgz", - "integrity": "sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz?cache=0&sync_timestamp=1621648305056&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpicomatch%2Fdownload%2Fpicomatch-2.3.0.tgz", - "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", - "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pnp-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.nlark.com/pnp-webpack-plugin/download/pnp-webpack-plugin-1.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpnp-webpack-plugin%2Fdownload%2Fpnp-webpack-plugin-1.7.0.tgz", - "integrity": "sha1-ZXQThPbYBW824iVajWf/wghm9ck=", - "dev": true, - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz", - "integrity": "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g=", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.nlark.com/debug/download/debug-3.2.7.tgz", - "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmmirror.com/postcss/download/postcss-7.0.39.tgz?cache=0&sync_timestamp=1634821260697&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss%2Fdownload%2Fpostcss-7.0.39.tgz", - "integrity": "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk=", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/picocolors/download/picocolors-0.2.1.tgz", - "integrity": "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.5.tgz?cache=0&sync_timestamp=1609689139608&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-7.0.5.tgz", - "integrity": "sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4=", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/postcss-colormin/download/postcss-colormin-4.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-colormin%2Fdownload%2Fpostcss-colormin-4.0.3.tgz", - "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz", - "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.nlark.com/postcss-load-config/download/postcss-load-config-2.1.2.tgz", - "integrity": "sha1-xepQTyxK7zPHNZo03jVzdyrXUCo=", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/postcss-loader/download/postcss-loader-3.0.0.tgz", - "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.nlark.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz?cache=0&sync_timestamp=1629280581385&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-minify-gradients%2Fdownload%2Fpostcss-minify-gradients-4.0.2.tgz", - "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz", - "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz?cache=0&sync_timestamp=1602588417522&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.3.tgz?cache=0&sync_timestamp=1602588090260&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A=", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz?cache=0&sync_timestamp=1602593137586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-2.2.0.tgz", - "integrity": "sha1-OFyuATzHdD9afXYC0Qc6iequYu4=", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz", - "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.nlark.com/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-ordered-values%2Fdownload%2Fpostcss-ordered-values-4.1.2.tgz", - "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-prefix-selector": { - "version": "1.13.0", - "resolved": "https://registry.nlark.com/postcss-prefix-selector/download/postcss-prefix-selector-1.13.0.tgz?cache=0&sync_timestamp=1630866711417&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-prefix-selector%2Fdownload%2Fpostcss-prefix-selector-1.13.0.tgz", - "integrity": "sha1-E2w+uEjtrO2QQXuxA4PeVsB1V/Y=", - "dev": true, - "requires": { - "postcss": "^8.3.6" - }, - "dependencies": { - "postcss": { - "version": "8.3.11", - "resolved": "https://registry.npmmirror.com/postcss/download/postcss-8.3.11.tgz?cache=0&sync_timestamp=1634821260697&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss%2Fdownload%2Fpostcss-8.3.11.tgz", - "integrity": "sha1-w77KfqgRzV4cSj7G0udZnvH4+Fg=", - "dev": true, - "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^0.6.2" - } - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.nlark.com/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/postcss-svgo/download/postcss-svgo-4.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-svgo%2Fdownload%2Fpostcss-svgo-4.0.3.tgz", - "integrity": "sha1-NDos26yVBdQWJD1Jb3JPOIlMlB4=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.nlark.com/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz", - "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", - "dev": true - }, - "posthtml": { - "version": "0.9.2", - "resolved": "https://registry.nlark.com/posthtml/download/posthtml-0.9.2.tgz", - "integrity": "sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=", - "dev": true, - "requires": { - "posthtml-parser": "^0.2.0", - "posthtml-render": "^1.0.5" - } - }, - "posthtml-parser": { - "version": "0.2.1", - "resolved": "https://registry.nlark.com/posthtml-parser/download/posthtml-parser-0.2.1.tgz", - "integrity": "sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=", - "dev": true, - "requires": { - "htmlparser2": "^3.8.3", - "isobject": "^2.1.0" - }, - "dependencies": { - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.nlark.com/domhandler/download/domhandler-2.4.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.nlark.com/entities/download/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.nlark.com/htmlparser2/download/htmlparser2-3.10.1.tgz", - "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "posthtml-rename-id": { - "version": "1.0.12", - "resolved": "https://registry.npm.taobao.org/posthtml-rename-id/download/posthtml-rename-id-1.0.12.tgz", - "integrity": "sha1-z39us3FGvxr6wx5o8YxswZrmFDM=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "posthtml-render": { - "version": "1.4.0", - "resolved": "https://registry.nlark.com/posthtml-render/download/posthtml-render-1.4.0.tgz", - "integrity": "sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM=", - "dev": true - }, - "posthtml-svg-mode": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/posthtml-svg-mode/download/posthtml-svg-mode-1.0.3.tgz", - "integrity": "sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA=", - "dev": true, - "requires": { - "merge-options": "1.0.1", - "posthtml": "^0.9.2", - "posthtml-parser": "^0.2.1", - "posthtml-render": "^1.0.6" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.nlark.com/prepend-http/download/prepend-http-1.0.4.tgz?cache=0&sync_timestamp=1628547381568&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprepend-http%2Fdownload%2Fprepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.nlark.com/prettier/download/prettier-2.4.1.tgz?cache=0&sync_timestamp=1631777167012&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprettier%2Fdownload%2Fprettier-2.4.1.tgz", - "integrity": "sha1-Zx4RyJwUpM/Ids5WQQbEpnJsn1w=", - "dev": true, - "optional": true - }, - "pretty-error": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/pretty-error/download/pretty-error-2.1.2.tgz?cache=0&sync_timestamp=1635212589197&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpretty-error%2Fdownload%2Fpretty-error-2.1.2.tgz", - "integrity": "sha1-von4LYGxyG7I/fvDhQRYgnJ/k7Y=", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^2.0.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz", - "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", - "dev": true - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz", - "integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz", - "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", - "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.12.0.tgz", - "integrity": "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og=", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz?cache=0&sync_timestamp=1591853319485&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquery-string%2Fdownload%2Fquery-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.nlark.com/querystring/download/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.2.0.tgz?cache=0&sync_timestamp=1597686657045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquerystringify%2Fdownload%2Fquerystringify-2.2.0.tgz", - "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", - "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.nlark.com/read-pkg/download/read-pkg-5.2.0.tgz?cache=0&sync_timestamp=1628984780649&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fread-pkg%2Fdownload%2Fread-pkg-5.2.0.tgz", - "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", - "dev": true, - "requires": { - "@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": { - "version": "2.3.7", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", - "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz", - "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604218545452&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz", - "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "9.0.0", - "resolved": "https://registry.nlark.com/regenerate-unicode-properties/download/regenerate-unicode-properties-9.0.0.tgz?cache=0&sync_timestamp=1631617208210&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerate-unicode-properties%2Fdownload%2Fregenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY=", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626992969133&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz", - "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.nlark.com/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1627057533376&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz", - "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz?cache=0&sync_timestamp=1610725679574&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexp.prototype.flags%2Fdownload%2Fregexp.prototype.flags-1.3.1.tgz", - "integrity": "sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "regexpu-core": { - "version": "4.8.0", - "resolved": "https://registry.nlark.com/regexpu-core/download/regexpu-core-4.8.0.tgz?cache=0&sync_timestamp=1631619101495&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.8.0.tgz", - "integrity": "sha1-5WBbo2G2excYR4UBMnUC9EeamPA=", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^9.0.0", - "regjsgen": "^0.5.2", - "regjsparser": "^0.7.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmmirror.com/regjsgen/download/regjsgen-0.5.2.tgz", - "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", - "dev": true - }, - "regjsparser": { - "version": "0.7.0", - "resolved": "https://registry.nlark.com/regjsparser/download/regjsparser-0.7.0.tgz", - "integrity": "sha1-prZntUyIXhi1JVTLSWDvcRh+mWg=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz?cache=0&sync_timestamp=1603892968504&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/renderkid/download/renderkid-2.0.7.tgz?cache=0&sync_timestamp=1635212582997&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Frenderkid%2Fdownload%2Frenderkid-2.0.7.tgz", - "integrity": "sha1-Rk8namvc7mBvShWZP5sp/HTKhgk=", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.nlark.com/css-select/download/css-select-4.1.3.tgz?cache=0&sync_timestamp=1622994276976&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-select%2Fdownload%2Fcss-select-4.1.3.tgz", - "integrity": "sha1-pwRA9wMX8maRGK10/xBeZYSccGc=", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/css-what/download/css-what-5.1.0.tgz", - "integrity": "sha1-P3tweq32M7r2LCzrhXm1RbtA9/4=", - "dev": true - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz", - "integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.nlark.com/domelementtype/download/domelementtype-2.2.0.tgz", - "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", - "dev": true - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz", - "integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz", - "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", - "dev": true - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.nlark.com/nth-check/download/nth-check-2.0.1.tgz", - "integrity": "sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.nlark.com/repeat-element/download/repeat-element-1.1.4.tgz", - "integrity": "sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz", - "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=" - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz?cache=0&sync_timestamp=1613054898763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.20.0.tgz", - "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/restore-cursor/download/restore-cursor-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frestore-cursor%2Fdownload%2Frestore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.nlark.com/retry/download/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "sass": { - "version": "1.26.8", - "resolved": "https://registry.npmmirror.com/sass/download/sass-1.26.8.tgz", - "integrity": "sha1-MSZSUwch+VaNTEAAsNsH7G6yMyU=", - "dev": true, - "requires": { - "chokidar": ">=2.0.0 <4.0.0" - } - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/sass-loader/download/sass-loader-8.0.2.tgz?cache=0&sync_timestamp=1635385383233&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsass-loader%2Fdownload%2Fsass-loader-8.0.2.tgz", - "integrity": "sha1-3r7NjDziQ8dkVPLoKQSCFQOACQ0=", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-2.7.1.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-2.7.1.tgz", - "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.nlark.com/selfsigned/download/selfsigned-1.10.11.tgz?cache=0&sync_timestamp=1620160245612&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fselfsigned%2Fdownload%2Fselfsigned-1.10.11.tgz", - "integrity": "sha1-JJKc2Qb+D0S20B+yOZmnOVN6y+k=", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.nlark.com/serialize-javascript/download/serialize-javascript-4.0.0.tgz?cache=0&sync_timestamp=1624284098038&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-4.0.0.tgz", - "integrity": "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.nlark.com/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1593407676624&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", - "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-3.0.1.tgz", - "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1628896304371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmmirror.com/shell-quote/download/shell-quote-1.7.3.tgz?cache=0&sync_timestamp=1634798222474&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fshell-quote%2Fdownload%2Fshell-quote-1.7.3.tgz", - "integrity": "sha1-qkDtrBcERbmkMeF7tiwLiBucQSM=", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/side-channel/download/side-channel-1.0.4.tgz", - "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.5.tgz", - "integrity": "sha1-nj6MwMdamUcrRDIQM6dwLnc4JS8=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz", - "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", - "dev": true - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.21.tgz?cache=0&sync_timestamp=1596167301825&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs%2Fdownload%2Fsockjs-0.3.21.tgz", - "integrity": "sha1-s0/7mOeWkwtgoM+hGQTWozmn1Bc=", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.5.2", - "resolved": "https://registry.nlark.com/sockjs-client/download/sockjs-client-1.5.2.tgz", - "integrity": "sha1-S8SMLanOR2nxnccjOWtQ9cEjMKM=", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.3" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.nlark.com/debug/download/debug-3.2.7.tgz", - "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618601044820&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", - "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/source-map-js/download/source-map-js-0.6.2.tgz", - "integrity": "sha1-C7XeYxtBz72mz7qL0FqA79/SOF4=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz", - "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.nlark.com/source-map-support/download/source-map-support-0.5.20.tgz", - "integrity": "sha1-EhZgifj15ejFaSazd2Mzkt0stsk=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.1.tgz?cache=0&sync_timestamp=1612211015749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-url%2Fdownload%2Fsource-map-url-0.4.1.tgz", - "integrity": "sha1-CvZmBadFpaL5HPG7+KevvCg97FY=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.nlark.com/spdx-license-ids/download/spdx-license-ids-3.0.10.tgz?cache=0&sync_timestamp=1628483195107&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.10.tgz", - "integrity": "sha1-DZvszN5wA9bGWNSH3UijLwvzAUs=", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz", - "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", - "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.nlark.com/ssri/download/ssri-6.0.2.tgz?cache=0&sync_timestamp=1621364918494&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fssri%2Fdownload%2Fssri-6.0.2.tgz", - "integrity": "sha1-FXk5E08gRk5zAd26PpD/qPdyisU=", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz", - "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz", - "integrity": "sha1-UkKUktY8YuuYmATBFVLj0i53kwM=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654014762&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", - "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.nlark.com/stream-http/download/stream-http-2.8.3.tgz", - "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz", - "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-version": "2.1.1", - "resolved": "https://registry.npmmirror.com/string-width/download/string-width-2.1.1.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-3.0.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127318238&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz", - "integrity": "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.1.tgz", - "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", - "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", - "dev": true - } - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/strip-final-newline/download/strip-final-newline-2.0.0.tgz?cache=0&sync_timestamp=1620046435959&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-final-newline%2Fdownload%2Fstrip-final-newline-2.0.0.tgz", - "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", - "dev": true - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/stylehacks/download/stylehacks-4.0.3.tgz?cache=0&sync_timestamp=1621449783387&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstylehacks%2Fdownload%2Fstylehacks-4.0.3.tgz", - "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-baker": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/svg-baker/download/svg-baker-1.7.0.tgz", - "integrity": "sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "clone": "^2.1.1", - "he": "^1.1.1", - "image-size": "^0.5.1", - "loader-utils": "^1.1.0", - "merge-options": "1.0.1", - "micromatch": "3.1.0", - "postcss": "^5.2.17", - "postcss-prefix-selector": "^1.6.0", - "posthtml-rename-id": "^1.0", - "posthtml-svg-mode": "^1.0.3", - "query-string": "^4.3.2", - "traverse": "^0.6.6" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.nlark.com/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/has-flag/download/has-flag-1.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - }, - "micromatch": { - "version": "3.1.0", - "resolved": "https://registry.nlark.com/micromatch/download/micromatch-3.1.0.tgz", - "integrity": "sha1-UQLU6vILaZfWAI46z+HESj+oFeI=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.2.2", - "define-property": "^1.0.0", - "extend-shallow": "^2.0.1", - "extglob": "^2.0.2", - "fragment-cache": "^0.2.1", - "kind-of": "^5.0.2", - "nanomatch": "^1.2.1", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmmirror.com/postcss/download/postcss-5.2.18.tgz?cache=0&sync_timestamp=1634821260697&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpostcss%2Fdownload%2Fpostcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.nlark.com/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "svg-baker-runtime": { - "version": "1.4.7", - "resolved": "https://registry.npm.taobao.org/svg-baker-runtime/download/svg-baker-runtime-1.4.7.tgz", - "integrity": "sha1-9HIGN/W2IC7vY3jYHx/q0IFfik4=", - "dev": true, - "requires": { - "deepmerge": "1.3.2", - "mitt": "1.1.2", - "svg-baker": "^1.7.0" - }, - "dependencies": { - "deepmerge": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.3.2.tgz", - "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", - "dev": true - } - } - }, - "svg-sprite-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmmirror.com/svg-sprite-loader/download/svg-sprite-loader-4.1.3.tgz?cache=0&sync_timestamp=1635154315723&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsvg-sprite-loader%2Fdownload%2Fsvg-sprite-loader-4.1.3.tgz", - "integrity": "sha1-0lz6daXE5Jn3tSgigdtus72hP+A=", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "deepmerge": "1.3.2", - "domready": "1.0.8", - "escape-string-regexp": "1.0.5", - "html-webpack-plugin": "^3.2.0", - "loader-utils": "^1.1.0", - "svg-baker": "^1.4.0", - "svg-baker-runtime": "^1.4.0", - "url-slug": "2.0.0" - }, - "dependencies": { - "deepmerge": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.3.2.tgz", - "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", - "dev": true - } - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/svgo/download/svgo-1.2.2.tgz?cache=0&sync_timestamp=1633354062790&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsvgo%2Fdownload%2Fsvgo-1.2.2.tgz", - "integrity": "sha1-AlPTTszyrtStTyg+Ee51GY+dcxY=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", - "csso": "^3.5.1", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz", - "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.nlark.com/terser/download/terser-4.8.0.tgz?cache=0&sync_timestamp=1632229770103&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser%2Fdownload%2Fterser-4.8.0.tgz", - "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.nlark.com/terser-webpack-plugin/download/terser-webpack-plugin-1.4.5.tgz?cache=0&sync_timestamp=1631202322859&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-1.4.5.tgz", - "integrity": "sha1-oheu+uozDnNP+sthIOwfoxLWBAs=", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.nlark.com/find-cache-dir/download/find-cache-dir-2.1.0.tgz", - "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", - "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz?cache=0&sync_timestamp=1628765027018&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/pkg-dir/download/pkg-dir-3.0.0.tgz?cache=0&sync_timestamp=1633498116014&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpkg-dir%2Fdownload%2Fpkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.1.tgz?cache=0&sync_timestamp=1592413466879&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthenify%2Fdownload%2Fthenify-3.3.1.tgz", - "integrity": "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thread-loader": { - "version": "2.1.3", - "resolved": "https://registry.nlark.com/thread-loader/download/thread-loader-2.1.3.tgz", - "integrity": "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo=", - "dev": true, - "requires": { - "loader-runner": "^2.3.1", - "loader-utils": "^1.1.0", - "neo-async": "^2.6.0" - } - }, - "throttle-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz?cache=0&sync_timestamp=1591627175939&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrottle-debounce%2Fdownload%2Fthrottle-debounce-1.1.0.tgz", - "integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz", - "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.12.tgz?cache=0&sync_timestamp=1603793691414&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimers-browserify%2Fdownload%2Ftimers-browserify-2.0.12.tgz", - "integrity": "sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4=", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz", - "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npm.taobao.org/traverse/download/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz", - "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=", - "dev": true - }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.2.0.tgz", - "integrity": "sha1-pQCtCEsHmPHDBxrzkeZZEshrypI=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.6.0.tgz", - "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1592744803278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", - "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.nlark.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz", - "integrity": "sha1-CF4hViXsMWJXTciFmr7nilmxRHE=", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw=", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-2.0.0.tgz?cache=0&sync_timestamp=1631618696521&other_urls=https%3A%2F%2Fregistry.nlark.com%2Funicode-match-property-ecmascript%2Fdownload%2Funicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ=", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g=", - "dev": true - }, - "unidecode": { - "version": "0.1.8", - "resolved": "https://registry.npm.taobao.org/unidecode/download/unidecode-0.1.8.tgz", - "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", - "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", - "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&sync_timestamp=1604768637331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz", - "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237586670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz", - "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-2.3.0.tgz?cache=0&sync_timestamp=1602252665628&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furl-loader%2Fdownload%2Furl-loader-2.3.0.tgz", - "integrity": "sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs=", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - } - }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.nlark.com/url-parse/download/url-parse-1.5.3.tgz?cache=0&sync_timestamp=1627252196051&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl-parse%2Fdownload%2Furl-parse-1.5.3.tgz", - "integrity": "sha1-ccEwPTj7Zjmt4YPCmSyMwGht+GI=", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-slug": { - "version": "2.0.0", - "resolved": "https://registry.nlark.com/url-slug/download/url-slug-2.0.0.tgz", - "integrity": "sha1-p4nVrtSZXA2VrzM3etHVxo1NcCc=", - "dev": true, - "requires": { - "unidecode": "0.1.8" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.nlark.com/util/download/util-0.11.1.tgz?cache=0&sync_timestamp=1622213272480&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.11.1.tgz", - "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz", - "integrity": "sha1-a693dLgO6w91INi4HQeYKlmruu4=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.nlark.com/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1622213269703&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - }, - "v-viewer": { - "version": "1.5.1", - "resolved": "https://registry.nlark.com/v-viewer/download/v-viewer-1.5.1.tgz", - "integrity": "sha1-lIBNg4FMylZuaRM5/h5keTSG8gA=", - "requires": { - "throttle-debounce": "^2.0.1", - "viewerjs": "^1.5.0" - }, - "dependencies": { - "throttle-debounce": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-2.3.0.tgz?cache=0&sync_timestamp=1604313823250&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrottle-debounce%2Fdownload%2Fthrottle-debounce-2.3.0.tgz", - "integrity": "sha1-/TGGXmZQIHHkEYF+JBRls+nDcuI=" - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz?cache=0&sync_timestamp=1615203397897&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvendors%2Fdownload%2Fvendors-1.0.4.tgz", - "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "viewerjs": { - "version": "1.10.2", - "resolved": "https://registry.npmmirror.com/viewerjs/download/viewerjs-1.10.2.tgz", - "integrity": "sha1-3hb6EGaOTaYyWWmDajJkoEbj75o=" - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz", - "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", - "dev": true - }, - "vue": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.11.tgz", - "integrity": "sha1-dllNh31LEiNEBuhONSdcbVFBJcU=" - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", - "dev": true - }, - "vue-loader": { - "version": "15.9.8", - "resolved": "https://registry.npmmirror.com/vue-loader/download/vue-loader-15.9.8.tgz", - "integrity": "sha1-Sw9gKvr2aplr4eU0+5YJ3EqxDmE=", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - } - } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.8.2", - "resolved": "https://registry.npmmirror.com/vue-loader/download/vue-loader-16.8.2.tgz", - "integrity": "sha1-eFUtZVggepPwnk+2iwaNRJZOt0A=", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", - "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "loader-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/loader-utils/download/loader-utils-2.0.1.tgz", - "integrity": "sha1-O41DhvQjeNZDTTLXvAjnpS05V14=", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", - "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "vue-router": { - "version": "3.3.4", - "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.3.4.tgz?cache=0&sync_timestamp=1594139127797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.3.4.tgz", - "integrity": "sha1-Tjirw0oRxBtsPYJERJouNjumJQs=" - }, - "vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.3.tgz?cache=0&sync_timestamp=1614758618345&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-style-loader%2Fdownload%2Fvue-style-loader-4.1.3.tgz", - "integrity": "sha1-bVWGOlH6dXqyTonZNxRlByqnvDU=", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - } - } - }, - "vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.11.tgz", - "integrity": "sha1-wEcE749JixUxMAGJk+VjCdRpgIA=", - "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", - "dev": true - }, - "vuex": { - "version": "3.5.1", - "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.5.1.tgz?cache=0&sync_timestamp=1593445037188&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvuex%2Fdownload%2Fvuex-3.5.1.tgz", - "integrity": "sha1-8bjc6mSbwlJUz09DWAgdv12hiz0=" - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.nlark.com/watchpack/download/watchpack-1.7.5.tgz", - "integrity": "sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM=", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz?cache=0&sync_timestamp=1604989085906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack-chokidar2%2Fdownload%2Fwatchpack-chokidar2-2.0.1.tgz", - "integrity": "sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc=", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true, - "optional": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.nlark.com/chokidar/download/chokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1612537044236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcversion": "1.0.1", - "resolved": "https://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmmirror.com/webpack/download/webpack-4.46.0.tgz?cache=0&sync_timestamp=1635520736057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack%2Fdownload%2Fwebpack-4.46.0.tgz", - "integrity": "sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.9.0", - "resolved": "https://registry.npmmirror.com/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.9.0.tgz?cache=0&sync_timestamp=1634019946266&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwebpack-bundle-analyzer%2Fdownload%2Fwebpack-bundle-analyzer-3.9.0.tgz", - "integrity": "sha1-9vlNsQj7V05BWtMT3kGicH0z7zw=", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.19", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1630916591807&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn%2Fdownload%2Facorn-7.4.1.tgz", - "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", - "dev": true - } - } - }, - "webpack-chain": { - "version": "6.5.1", - "resolved": "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-6.5.1.tgz?cache=0&sync_timestamp=1595813222470&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-chain%2Fdownload%2Fwebpack-chain-6.5.1.tgz", - "integrity": "sha1-TycoTLu2N+PI+970Pu9YjU2GEgY=", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^2.0.1" - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/download/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU=", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmmirror.com/webpack-dev-server/download/webpack-dev-server-3.11.2.tgz", - "integrity": "sha1-aV687Xakkp8NXef9c/r+GF/jNwg=", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-2.1.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.nlark.com/chokidar/download/chokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1604880267387&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/find-up/download/find-up-3.0.0.tgz?cache=0&sync_timestamp=1633618766404&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffind-up%2Fdownload%2Ffind-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1612537044236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-3.1.0.tgz?cache=0&sync_timestamp=1632953810778&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.nlark.com/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.nlark.com/is-absolute-url/download/is-absolute-url-3.0.3.tgz", - "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/locate-path/download/locate-path-3.0.0.tgz?cache=0&sync_timestamp=1629895618224&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flocate-path%2Fdownload%2Flocate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/p-locate/download/p-locate-3.0.0.tgz?cache=0&sync_timestamp=1629892761309&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fp-locate%2Fdownload%2Fp-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz?cache=0&sync_timestamp=1628765027018&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpath-exists%2Fdownload%2Fpath-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.nlark.com/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1626694800155&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/string-width/download/string-width-3.1.0.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-5.1.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-4.1.0.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1632420562057&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmmirror.com/yargs/download/yargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.nlark.com/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1624233886384&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz?cache=0&sync_timestamp=1615477439589&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-log%2Fdownload%2Fwebpack-log-2.0.0.tgz", - "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.nlark.com/webpack-merge/download/webpack-merge-4.2.2.tgz", - "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.nlark.com/webpack-sources/download/webpack-sources-1.4.3.tgz?cache=0&sync_timestamp=1631547057681&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-1.4.3.tgz", - "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.4.tgz", - "integrity": "sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A=", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz", - "integrity": "sha1-f4RzvIOd/YdgituV1+sHUhFXikI=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", - "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&sync_timestamp=1631557327268&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", - "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", - "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-4.2.3.tgz", - "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ws/download/ws-6.2.2.tgz?cache=0&sync_timestamp=1633200103980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fws%2Fdownload%2Fws-6.2.2.tgz", - "integrity": "sha1-3Vzb1XqZeZFgl2UtePHMX66gwy4=", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xss": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/xss/download/xss-1.0.8.tgz?cache=0&sync_timestamp=1595840138718&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxss%2Fdownload%2Fxss-1.0.8.tgz", - "integrity": "sha1-Mv64f+t0s9zT1AS3poq6vxBwBTU=", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.nlark.com/y18n/download/y18n-4.0.3.tgz", - "integrity": "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", - "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmmirror.com/yargs/download/yargs-16.2.0.tgz", - "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-7.0.4.tgz?cache=0&sync_timestamp=1604880267387&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-7.0.4.tgz", - "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.nlark.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz?cache=0&sync_timestamp=1632421013520&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-4.2.3.tgz", - "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz", - "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.nlark.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1624233886384&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", - "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", - "dev": true - }, - "zrender": { - "version": "4.3.2", - "resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.2.tgz?cache=0&sync_timestamp=1597683734966&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fzrender%2Fdownload%2Fzrender-4.3.2.tgz", - "integrity": "sha1-7HQy+UFcgsc1hLa3uMR+GwFiCcY=" - } - } -} diff --git a/blog-cms/package.json b/blog-cms/package.json index 3f7e5e971..53ac7ebde 100644 --- a/blog-cms/package.json +++ b/blog-cms/package.json @@ -11,6 +11,7 @@ "dependencies": { "axios": "0.24.0", "core-js": "3.6.5", + "cos-js-sdk-v5": "^1.4.10", "echarts": "4.9.0", "element-ui": "2.13.2", "lodash": "4.17.19", diff --git a/blog-cms/public/index.html b/blog-cms/public/index.html index 5c5091059..1f2faf878 100644 --- a/blog-cms/public/index.html +++ b/blog-cms/public/index.html @@ -6,13 +6,13 @@ 后台管理 - NBlog - + lib/css/prism.css"> We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue. - + diff --git a/blog-cms/public/lib/css/prism.css b/blog-cms/public/lib/css/prism.css new file mode 100644 index 000000000..f93a519aa --- /dev/null +++ b/blog-cms/public/lib/css/prism.css @@ -0,0 +1,261 @@ +/* PrismJS 1.25.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+bash+c+cpp+docker+git+go+java+javadoc+javadoclike+json+json5+jsonp+lua+markdown+markup-templating+nginx+perl+php+php-extras+plsql+powershell+properties+python+r+rust+sass+scss+shell-session+sql+visual-basic+yaml&plugins=line-numbers+highlight-keywords+toolbar+copy-to-clipboard+match-braces */ +/** + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard + */ + +code[class*="language-"], +pre[class*="language-"] { + color: #ccc; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)> code[class*="language-"], +pre[class*="language-"] { + background: #2d2d2d; +} + +/* Inline code */ +:not(pre)> code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #999; +} + +.token.punctuation { + color: #ccc; +} + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; +} + +.token.function-name { + color: #6196cc; +} + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; +} + +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: #f8c555; +} + +.token.selector, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; +} + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; +} + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.inserted { + color: green; +} + +pre[class*="language-"].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; +} + +pre[class*="language-"].line-numbers> code { + position: relative; + white-space: inherit; +} + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + +} + + .line-numbers-rows> span { + display: block; + counter-increment: linenumber; + } + + .line-numbers-rows> span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; + } + +div.code-toolbar { + position: relative; +} + +div.code-toolbar> .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; +} + +div.code-toolbar:hover> .toolbar { + opacity: 1; +} + +/* Separate line b/c rules are thrown out if selector is invalid. + IE11 and old Edge versions don't support :focus-within. */ +div.code-toolbar:focus-within> .toolbar { + opacity: 1; +} + +div.code-toolbar> .toolbar> .toolbar-item { + display: inline-block; +} + +div.code-toolbar> .toolbar> .toolbar-item> a { + cursor: pointer; +} + +div.code-toolbar> .toolbar> .toolbar-item> button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; /* for button */ + -moz-user-select: none; + -ms-user-select: none; +} + +div.code-toolbar> .toolbar> .toolbar-item> a, +div.code-toolbar> .toolbar> .toolbar-item> button, +div.code-toolbar> .toolbar> .toolbar-item> span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); + border-radius: .5em; +} + +div.code-toolbar> .toolbar> .toolbar-item> a:hover, +div.code-toolbar> .toolbar> .toolbar-item> a:focus, +div.code-toolbar> .toolbar> .toolbar-item> button:hover, +div.code-toolbar> .toolbar> .toolbar-item> button:focus, +div.code-toolbar> .toolbar> .toolbar-item> span:hover, +div.code-toolbar> .toolbar> .toolbar-item> span:focus { + color: inherit; + text-decoration: none; +} + +.token.punctuation.brace-hover, +.token.punctuation.brace-selected { + outline: solid 1px; +} + +.rainbow-braces .token.punctuation.brace-level-1, +.rainbow-braces .token.punctuation.brace-level-5, +.rainbow-braces .token.punctuation.brace-level-9 { + color: #E50; + opacity: 1; +} +.rainbow-braces .token.punctuation.brace-level-2, +.rainbow-braces .token.punctuation.brace-level-6, +.rainbow-braces .token.punctuation.brace-level-10 { + color: #0B3; + opacity: 1; +} +.rainbow-braces .token.punctuation.brace-level-3, +.rainbow-braces .token.punctuation.brace-level-7, +.rainbow-braces .token.punctuation.brace-level-11 { + color: #26F; + opacity: 1; +} +.rainbow-braces .token.punctuation.brace-level-4, +.rainbow-braces .token.punctuation.brace-level-8, +.rainbow-braces .token.punctuation.brace-level-12 { + color: #E0E; + opacity: 1; +} + diff --git a/blog-cms/public/lib/js/prism.js b/blog-cms/public/lib/js/prism.js new file mode 100644 index 000000000..b7ddca640 --- /dev/null +++ b/blog-cms/public/lib/js/prism.js @@ -0,0 +1,43 @@ +/* PrismJS 1.25.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+bash+c+cpp+docker+git+go+java+javadoc+javadoclike+json+json5+jsonp+lua+markdown+markup-templating+nginx+perl+php+php-extras+plsql+powershell+properties+python+r+rust+sass+scss+shell-session+sql+visual-basic+yaml&plugins=line-numbers+highlight-keywords+toolbar+copy-to-clipboard+match-braces */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var b=m.value;if(t.length>n.length)return;if(!(b instanceof W)){var k,x=1;if(h){if(!(k=z(v,y,n,f))||k.index>=n.length)break;var w=k.index,A=k.index+k[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,p+=m.value.length;if(p-=m.value.length,y=p,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(Pl.reach&&(l.reach=N);var j=m.prev;O&&(j=I(t,j,O),y+=O.length),q(t,j,x);var C=new W(o,g?M.tokenize(S,g):S,d,S);if(m=I(t,j,C),L&&I(t,m,L),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var t=M.util.currentScript();function r(){M.manual||M.highlightAll()}if(t&&(M.filename=t.src,t.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var a=document.readyState;"loading"===a||"interactive"===a&&t&&t.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\s]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=2円$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!1円)[^\\\r\n])*1円/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!2円)[^\\\r\n])*2円(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+2円)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\s]*?(?:\r?\n|\r)2円/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)2円\s[\s\s]*?(?:\r?\n|\r)3円/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\s]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\s])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:regexp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[]&?|[][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],i=a.variable[1].inside,o=0;o>=?|<<=?|->|([-+&|:])1円|[?:~]|[-+*/%&|^!=]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^]|<(?:[^]|<[^]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\s]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/r"([^()\\ ]{0,16})\([\s\S]*?\)1円"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^]|<[^]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\s]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertbefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertbefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertbefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(prism); +!function(e){var r="(?:[ \t]+(?![ \t])(?:)?|)".replace(//g,function(){return"\\\\[\r\n](?:\\s|\\\\[\r\n]|#.*(?!.))*(?![\\s#]|\\\\[\r\n])"}),n="\"(?:[^\"\\\\\r\n]|\\\\(?:\r\n|[^]))*\"|'(?:[^'\\\\\r\n]|\\\\(?:\r\n|[^]))*'",t="--[\\w-]+=(?:|(?![\"'])(?:[^\\s\\\\]|\\\\.)+)".replace(//g,function(){return n}),o={pattern:RegExp(n),greedy:!0},i={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function a(e,n){return e=e.replace(//g,function(){return t}).replace(//g,function(){return r}),RegExp(e,n)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:a("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[o,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:a("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:a("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \t\\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:a("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:i,string:o,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:i},e.languages.dockerfile=e.languages.docker}(Prism); +Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!1円)[^\\\r\n])*1円/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!1円)[^\\])*1円/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),delete Prism.languages.go["class-name"]; +!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?1円;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?1円;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?2円;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\s]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\s]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\s]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertbefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\s]|[^\\"])*"|'(?:\\[\s\s]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\s]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildplaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\s]|(?!1円)[^\\])*1円|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); +!function(p){var a=p.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(a,"addSupport",{value:function(a,e){"string"==typeof a&&(a=[a]),a.forEach(function(a){!function(a,e){var n="doc-comment",t=p.languages[a];if(t){var r=t[n];if(!r){var o={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}};r=(t=p.languages.insertBefore(a,"comment",o))[n]}if(r instanceof RegExp&&(r=t[n]={pattern:r}),Array.isArray(r))for(var i=0,s=r.length;i/g,function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"});a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[a-z]\w*>/,lookbehind:!0,inside:{punctuation:/[.]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/2円>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism); +Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json; +!function(n){var e=/("|')(?:\\(?:\r\n?|\n|.)|(?!1円)[^\\\r\n])*1円/;n.languages.json5=n.languages.extend("json",{property:[{pattern:RegExp(e.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:e,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(Prism); +Prism.languages.jsonp=Prism.languages.extend("json",{punctuation:/[{}[\]();,.]/}),Prism.languages.insertBefore("jsonp","punctuation",{function:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/}); +Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]1円\]|.*)/m,string:{pattern:/(["'])(?:(?!1円)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*1円|\[(=*)\[[\s\S]*?\]2円\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}; +!function(s){function n(n){return n=n.replace(//g,function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var e="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,function(){return e}),a="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";s.languages.markdown=s.languages.extend("markup",{}),s.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:s.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+a+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+a+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(e),inside:s.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(e),alias:"important",inside:s.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*2円){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+\2円"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=1円$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(e){["url","bold","italic","strike","code-snippet"].forEach(function(n){e!==n&&(s.languages.markdown[e].inside.content.inside[n]=s.languages.markdown[n])})}),s.hooks.add("after-tokenize",function(n){"markdown"!==n.language&&"md"!==n.language||!function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},u=String.fromCodePoint||String.fromCharCode;s.languages.md=s.languages.markdown}(Prism); +!function(e){var n=/\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;Prism.languages.nginx={comment:{pattern:/(^|[\s{};])#.*/,lookbehind:!0},directive:{pattern:/(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:{string:{pattern:/((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,lookbehind:!0,inside:{escape:{pattern:/\\["'\\nrt]/,alias:"entity"},variable:n}},comment:{pattern:/(\s)#.*/,lookbehind:!0,greedy:!0},keyword:{pattern:/^\S+/,greedy:!0},boolean:{pattern:/(\s)(?:off|on)(?!\S)/,lookbehind:!0},number:{pattern:/(\s)\d+[a-z]*(?!\S)/i,lookbehind:!0},variable:n}},punctuation:/[{};]/}}(); +Prism.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0}],string:[{pattern:/\b(?:q|qq|qw|qx)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!1円)[^\\]|\\[\s\s])*1円/,greedy:!0},{pattern:/\b(?:q|qq|qw|qx)\s+([a-za-z0-9])(?:(?!1円)[^\\]|\\[\s\s])*1円/,greedy:!0},{pattern:/\b(?:q|qq|qw|qx)\s*\((?:[^()\\]|\\[\s\s])*\)/,greedy:!0},{pattern:/\b(?:q|qq|qw|qx)\s*\{(?:[^{}\\]|\\[\s\s])*\}/,greedy:!0},{pattern:/\b(?:q|qq|qw|qx)\s*\[(?:[^[\]\\]|\\[\s\s])*\]/,greedy:!0},{pattern:/\b(?:q|qq|qw|qx)\s*<(?:[^\\]|\\[\s\S])*>/,greedy:!0},{pattern:/("|`)(?:(?!1円)[^\\]|\\[\s\S])*1円/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:/\b(?:m|qr)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!1円)[^\\]|\\[\s\s])*1円[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s+([a-za-z0-9])(?:(?!1円)[^\\]|\\[\s\s])*1円[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\s])*\)[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\s])*\}[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\s])*\][msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*<(?:[^\\]|\\[\s\S])*>[msixpodualngc]*/,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!2円)[^\\]|\\[\s\s])*2円(?:(?!2円)[^\\]|\\[\s\s])*2円[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s+([a-za-z0-9])(?:(?!2円)[^\\]|\\[\s\s])*2円(?:(?!2円)[^\\]|\\[\s\s])*2円[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\s])*\)\s*\((?:[^()\\]|\\[\s\s])*\)[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\s])*\}\s*\{(?:[^{}\\]|\\[\s\s])*\}[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\s])*\]\s*\[(?:[^[\]\\]|\\[\s\s])*\][msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*<(?:[^\\]|\\[\s\S])*>\s*<(?:[^\\]|\\[\s\S])*>[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\s*>|\b_\b/,alias:"symbol"},vstring:{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/sub \w+/i,inside:{keyword:/sub/}},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}; +Prism.languages.insertBefore("php","variable",{this:/\$this\b/,global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/parent|self|static/,punctuation:/::|\\/}}}); +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!1円)[^\\])+1円/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!2円)[^\\]|2円2円)*2円/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[^~!]=|\.\.|\|\||\*\*|[-+*/%=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}}); +!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\s]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},r=i.string[0].inside;r.boolean=i.boolean,r.variable=i.variable,r.function.inside=i}(); +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,punctuation:/[=:]/}; +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?1円|("|')(?:\\.|(?!2円)[^\\\r\n])*2円)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?1円/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!1円)[^\\\r\n])*1円/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!1円)[^\\\r\n])*1円/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:FALSE|TRUE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:Inf|NaN)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}; +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,function(){return a});a=a.replace(//g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!1円))*"1円/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0,alias:"string"},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[a-z_][a-z_\d]+\b/,"class-name":/\b[a-z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\da-fa-f](?:_?[\da-fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); +!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)1円[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var r=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:r,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:r,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)1円[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(Prism); +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +!function(s){var n=['"(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^"\\\\`$])*"',"'[^']*'","\\$'(?:[^'\\\\]|\\\\[^])*'","<<-?\\s*([\"']?)(\\w+)\1円\\s[^]*?[\r\n]\2円"].join("|");s.languages["shell-session"]={command:{pattern:regexp('^(?:[^\\s@:$#%*!/\\\\]+@[^\r\n@:$#%*!/\\\\]+(?::[^0円-\\x1f$#%*?":;|]+)?|[/~.][^0円-\\x1F$#%*?"@:;|]*)?[$#%](?=\\s)'+"(?:[^\\\\\r\n \t'\"<$]|[ \t](?:(?!#)|#.*$)|\\\\(?:[^\r]|\r\n?)|\\$(?!')|<(?!<)|<>)+".replace(/<>/g,function(){return n}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$%]+/,alias:"punctuation",inside:{user:/^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#%]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#%]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism); +Prism.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:[^\S\r\n]_[^\S\r\n]*(?:\r\n?|\n)|.)+/i,alias:"comment",greedy:!0},string:{pattern:/\$?["""](?:["""]{2}|[^"""])*["""]C?/i,greedy:!0},date:{pattern:/#[^\S\r\n]*(?:\d+([/-])\d+1円\d+(?:[^\S\r\n]+(?:\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?))?|\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?)[^\S\r\n]*#/i,alias:"builtin"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,boolean:/\b(?:False|Nothing|True)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,operator:[/[+\-*/\\^<=>&#@$%!]/,{pattern:/([^\S\r\n])_(?=[^\S\r\n]*[\r\n])/,lookbehind:!0}],punctuation:/[{}().,:?]/},Prism.languages.vb=Prism.languages["visual-basic"],Prism.languages.vba=Prism.languages["visual-basic"]; +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+,ドル.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return e});return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\2円[^\r\n]+)*)".replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+a+"|"+d+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n { + NProgress.start() + config.headers['Accept'] = 'application/json' + const token = localStorage.getItem('upyunToken') + if (token) { + config.headers['Authorization'] = `Basic ${token}` + } + return config + }, + error => { + console.info(error) + return Promise.reject(error) + } +) + +// response interceptor +request.interceptors.response.use(response => { + NProgress.done() + return response.data + }, + error => { + console.info(error) + Message.error(error.message) + return Promise.reject(error) + } +) + +// 获取存储空间下指定目录的文件列表 +export function getBucketContents(bucket, path) { + path = path.startsWith('/') ? path : `/${path}` + return request({ + url: `/${bucket}${path}`, + method: 'GET', + }) +} + +// 删除文件 +export function delFile(bucket, path) { + return request({ + url: `/${bucket}${path}`, + method: 'DELETE' + }) +} + +// 上传文件至仓库指定目录下 +export function upload(bucket, path, fileName, data) { + path = path.startsWith('/') ? path : `/${path}` + path = path.endsWith('/') ? path : `${path}/` + return request({ + url: `/${bucket}${path}${fileName}`, + method: 'PUT', + data + }) +} \ No newline at end of file diff --git a/blog-cms/src/layout/components/Navbar.vue b/blog-cms/src/layout/components/Navbar.vue index f5d1f28c9..e742bfb20 100644 --- a/blog-cms/src/layout/components/Navbar.vue +++ b/blog-cms/src/layout/components/Navbar.vue @@ -62,7 +62,8 @@ } }, logout() { - window.localStorage.clear() + window.localStorage.removeItem('token') + window.localStorage.removeItem('user') this.$router.push('/login') this.msgSuccess('退出成功') } diff --git a/blog-cms/src/router/index.js b/blog-cms/src/router/index.js index 3f9740e34..6321dbe72 100644 --- a/blog-cms/src/router/index.js +++ b/blog-cms/src/router/index.js @@ -137,20 +137,38 @@ const routes = [ meta: {title: '配置', icon: 'el-icon-setting'} }, { - path: 'manage', - name: 'Manage', - component: () => import('@/views/pictureHosting/Manage'), - meta: {title: '管理', icon: 'el-icon-folder-opened'} + path: 'github', + name: 'GithubManage', + component: () => import('@/views/pictureHosting/GithubManage'), + meta: {title: 'GitHub', icon: 'el-icon-folder-opened'} + }, + { + path: 'upyun', + name: 'UpyunManage', + component: () => import('@/views/pictureHosting/UpyunManage'), + meta: {title: '又拍云', icon: 'el-icon-folder-opened'} + }, + { + path: 'txyun', + name: 'TxyunManage', + component: () => import('@/views/pictureHosting/TxyunManage'), + meta: {title: '腾讯云', icon: 'el-icon-folder-opened'} }, ] }, { path: '/system', name: 'System', - redirect: '/system/job', + redirect: '/system/account', component: Layout, meta: {title: '系统管理', icon: 'el-icon-s-tools'}, children: [ + { + path: 'account', + name: 'Account', + component: () => import('@/views/system/Account'), + meta: {title: '修改账户', icon: 'el-icon-user-solid'} + }, { path: 'job', name: 'JobList', @@ -235,4 +253,4 @@ router.beforeEach((to, from, next) => { next() }) -export default router \ No newline at end of file +export default router diff --git a/blog-cms/src/util/request.js b/blog-cms/src/util/request.js index 3ba880806..4133ac9d1 100644 --- a/blog-cms/src/util/request.js +++ b/blog-cms/src/util/request.js @@ -40,7 +40,9 @@ request.interceptors.response.use(response => { NProgress.done() const res = response.data if (res.code !== 200) { - Message.error(res.msg || 'Error') + let msg = res.msg || 'Error' + Message.error(msg) + return Promise.reject(new Error(msg)) } return res }, diff --git a/blog-cms/src/views/blog/blog/BlogList.vue b/blog-cms/src/views/blog/blog/BlogList.vue index 73a81d655..a74eae8db 100644 --- a/blog-cms/src/views/blog/blog/BlogList.vue +++ b/blog-cms/src/views/blog/blog/BlogList.vue @@ -132,11 +132,9 @@ methods: { getData() { getDataByQuery(this.queryInfo).then(res => { - if (res.code === 200) { - this.blogList = res.data.blogs.list - this.categoryList = res.data.categories - this.total = res.data.blogs.total - } + this.blogList = res.data.blogs.list + this.categoryList = res.data.categories + this.total = res.data.blogs.total }) }, search() { @@ -147,17 +145,13 @@ //切换博客置顶状态 blogTopChanged(row) { updateTop(row.id, row.top).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg); - } + this.msgSuccess(res.msg); }) }, //切换博客推荐状态 blogRecommendChanged(row) { updateRecommend(row.id, row.recommend).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg); - } + this.msgSuccess(res.msg); }) }, //编辑博客可见性 @@ -192,11 +186,9 @@ this.visForm.password = '' } updateVisibility(this.blogId, this.visForm).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - this.dialogVisible = false - } + this.msgSuccess(res.msg) + this.getData() + this.dialogVisible = false }) }, //监听 pageSize 改变事件 @@ -220,10 +212,8 @@ dangerouslyUseHTMLString: true }).then(() => { deleteBlogById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) }).catch(() => { this.$message({ diff --git a/blog-cms/src/views/blog/blog/WriteBlog.vue b/blog-cms/src/views/blog/blog/WriteBlog.vue index 5837de79a..7f49105d3 100644 --- a/blog-cms/src/views/blog/blog/WriteBlog.vue +++ b/blog-cms/src/views/blog/blog/WriteBlog.vue @@ -155,19 +155,15 @@ methods: { getData() { getCategoryAndTag().then(res => { - if (res.code === 200) { - this.categoryList = res.data.categories - this.tagList = res.data.tags - } + this.categoryList = res.data.categories + this.tagList = res.data.tags }) }, getBlog(id) { getBlogById(id).then(res => { - if (res.code === 200) { - this.computeCategoryAndTag(res.data) - this.form = res.data - this.radio = this.form.published ? (this.form.password !== '' ? 3 : 1) : 2 - } + this.computeCategoryAndTag(res.data) + this.form = res.data + this.radio = this.form.published ? (this.form.password !== '' ? 3 : 1) : 2 }) }, computeCategoryAndTag(blog) { @@ -199,17 +195,13 @@ this.form.category = null this.form.tags = null updateBlog(this.form).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.$router.push('/blog/list') - } + this.msgSuccess(res.msg) + this.$router.push('/blog/list') }) } else { saveBlog(this.form).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.$router.push('/blog/list') - } + this.msgSuccess(res.msg) + this.$router.push('/blog/list') }) } } else { diff --git a/blog-cms/src/views/blog/category/CategoryList.vue b/blog-cms/src/views/blog/category/CategoryList.vue index fba61fdd8..9e86c4d82 100644 --- a/blog-cms/src/views/blog/category/CategoryList.vue +++ b/blog-cms/src/views/blog/category/CategoryList.vue @@ -92,10 +92,8 @@ methods: { getData() { getData(this.queryInfo).then(res => { - if (res.code === 200) { - this.categoryList = res.data.list - this.total = res.data.total - } + this.categoryList = res.data.list + this.total = res.data.total }) }, //监听 pageSize 改变事件 @@ -119,11 +117,9 @@ this.$refs.addFormRef.validate(valid => { if (valid) { addCategory(this.addForm).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.addDialogVisible = false - this.getData() - } + this.msgSuccess(res.msg) + this.addDialogVisible = false + this.getData() }) } }) @@ -132,11 +128,9 @@ this.$refs.editFormRef.validate(valid => { if (valid) { editCategory(this.editForm).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.editDialogVisible = false - this.getData() - } + this.msgSuccess(res.msg) + this.editDialogVisible = false + this.getData() }) } }) @@ -149,10 +143,8 @@ }, deleteCategoryById(id) { deleteCategoryById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) } } diff --git a/blog-cms/src/views/blog/comment/CommentList.vue b/blog-cms/src/views/blog/comment/CommentList.vue index 50da47722..b5cdafe85 100644 --- a/blog-cms/src/views/blog/comment/CommentList.vue +++ b/blog-cms/src/views/blog/comment/CommentList.vue @@ -9,22 +9,22 @@ - - - + + + - + - + @@ -77,7 +77,7 @@ - + @@ -150,19 +150,15 @@ methods: { getCommentList() { getCommentListByQuery(this.queryInfo).then(res => { - if (res.code === 200) { - this.commentList = res.data.list - this.total = res.data.total - } + this.commentList = res.data.list + this.total = res.data.total }) }, getBlogList() { getBlogList().then(res => { - if (res.code === 200) { - this.blogList = res.data - this.blogList.unshift({id: -2, title: '友人帐'}) - this.blogList.unshift({id: -1, title: '关于我'}) - } + this.blogList = res.data + this.blogList.unshift({id: -2, title: '友人帐'}) + this.blogList.unshift({id: -1, title: '关于我'}) }) }, search() { @@ -193,20 +189,37 @@ this.queryInfo.pageNum = newPage this.getCommentList() }, - //切换评论公开状态 + //切换评论公开状态(如果切换成隐藏,则该评论的所有子评论都修改为同样的隐藏状态) commentPublishedChanged(row) { - updatePublished(row.id, row.published).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg); - } + if (row.published) { + updatePublished(row.id, row.published).then(res => { + this.msgSuccess(res.msg) + }) + } else { + //切换成隐藏状态 + let replyCommentList = [] + replyCommentList.push(row) + this.getAllReplyCommentList(row, replyCommentList) + + updatePublished(row.id, row.published).then(res => { + this.msgSuccess(res.msg) + replyCommentList.forEach(comment => { + comment.published = row.published + }) + }) + } + }, + //递归展开所有子评论 + getAllReplyCommentList(comment, replyCommentList) { + comment.replyComments.forEach(replyComment => { + replyCommentList.push(replyComment) + this.getAllReplyCommentList(replyComment, replyCommentList) }) }, //切换评论邮件提醒状态 commentNoticeChanged(row) { updateNotice(row.id, row.notice).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg); - } + this.msgSuccess(res.msg); }) }, deleteCommentById(id) { @@ -217,10 +230,8 @@ dangerouslyUseHTMLString: true }).then(() => { deleteCommentById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getCommentList() - } + this.msgSuccess(res.msg) + this.getCommentList() }) }).catch(() => { this.$message({ @@ -250,11 +261,9 @@ content: this.editForm.content, } editComment(form).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.editDialogVisible = false - this.getCommentList() - } + this.msgSuccess(res.msg) + this.editDialogVisible = false + this.getCommentList() }) } }) diff --git a/blog-cms/src/views/blog/moment/MomentList.vue b/blog-cms/src/views/blog/moment/MomentList.vue index 0a95b3eef..6f204e633 100644 --- a/blog-cms/src/views/blog/moment/MomentList.vue +++ b/blog-cms/src/views/blog/moment/MomentList.vue @@ -55,27 +55,23 @@ methods: { getMomentList() { getMomentListByQuery(this.queryInfo).then(res => { - if (res.code === 200) { - this.momentList = res.data.list - this.total = res.data.total - } + this.momentList = res.data.list + this.total = res.data.total }) }, //监听 pageSize 改变事件 handleSizeChange(newSize) { this.queryInfo.pageSize = newSize - this.getData() + this.getMomentList() }, //监听页码改变的事件 handleCurrentChange(newPage) { this.queryInfo.pageNum = newPage - this.getData() + this.getMomentList() }, momentPublishedChanged(row) { updatePublished(row.id, row.published).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - } + this.msgSuccess(res.msg) }) }, goEditMomentPage(id) { @@ -83,10 +79,8 @@ }, deleteMomentById(id) { deleteMomentById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getMomentList() - } + this.msgSuccess(res.msg) + this.getMomentList() }) } } diff --git a/blog-cms/src/views/blog/moment/WriteMoment.vue b/blog-cms/src/views/blog/moment/WriteMoment.vue index 116fc2b30..e396d024e 100644 --- a/blog-cms/src/views/blog/moment/WriteMoment.vue +++ b/blog-cms/src/views/blog/moment/WriteMoment.vue @@ -46,26 +46,20 @@ methods: { getMoment(id) { getMomentById(id).then(res => { - if (res.code === 200) { - this.form = res.data - } + this.form = res.data }) }, submit(published) { this.form.published = published if (this.$route.params.id) { updateMoment(this.form).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.$router.push('/blog/moment/list') - } + this.msgSuccess(res.msg) + this.$router.push('/blog/moment/list') }) } else { saveMoment(this.form).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.$router.push('/blog/moment/list') - } + this.msgSuccess(res.msg) + this.$router.push('/blog/moment/list') }) } } diff --git a/blog-cms/src/views/blog/tag/TagList.vue b/blog-cms/src/views/blog/tag/TagList.vue index 1fb82d61e..9d272713b 100644 --- a/blog-cms/src/views/blog/tag/TagList.vue +++ b/blog-cms/src/views/blog/tag/TagList.vue @@ -132,10 +132,8 @@ methods: { getData() { getData(this.queryInfo).then(res => { - if (res.code === 200) { - this.tagList = res.data.list - this.total = res.data.total - } + this.tagList = res.data.list + this.total = res.data.total }) }, //监听 pageSize 改变事件 @@ -160,11 +158,9 @@ this.$refs.addFormRef.validate(valid => { if (valid) { addTag(this.addForm).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.addDialogVisible = false - this.getData() - } + this.msgSuccess(res.msg) + this.addDialogVisible = false + this.getData() }) } }) @@ -173,11 +169,9 @@ this.$refs.editFormRef.validate(valid => { if (valid) { editTag(this.editForm).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.editDialogVisible = false - this.getData() - } + this.msgSuccess(res.msg) + this.editDialogVisible = false + this.getData() }) } }) @@ -188,10 +182,8 @@ }, deleteTagById(id) { deleteTagById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) } } diff --git a/blog-cms/src/views/dashboard/index.vue b/blog-cms/src/views/dashboard/index.vue index afef92930..bd8f91165 100644 --- a/blog-cms/src/views/dashboard/index.vue +++ b/blog-cms/src/views/dashboard/index.vue @@ -368,30 +368,28 @@ methods: { getData() { getDashboard().then(res => { - if (res.code === 200) { - this.pv = res.data.pv - this.uv = res.data.uv - this.blogCount = res.data.blogCount - this.commentCount = res.data.commentCount - //渲染分类数据 - this.categoryOption.legend.data = res.data.category.legend - this.categoryOption.series[0].data = res.data.category.series - this.initCategoryEcharts() - //渲染标签数据 - this.tagOption.legend.data = res.data.tag.legend - this.tagOption.series[0].data = res.data.tag.series - this.initTagEcharts() - //渲染访客地图数据 - let mapData = this.convertData(res.data.cityVisitor) - this.mapOption.series[1].data = mapData - this.mapOption.series[2].data = mapData.splice(0, 5) - this.initMapEcharts() - //渲染一周访问量数据 - this.visitRecordOption.xAxis.data = res.data.visitRecord.date - this.visitRecordOption.series[0].data = res.data.visitRecord.pv - this.visitRecordOption.series[1].data = res.data.visitRecord.uv - this.initVisitRecordEcharts() - } + this.pv = res.data.pv + this.uv = res.data.uv + this.blogCount = res.data.blogCount + this.commentCount = res.data.commentCount + //渲染分类数据 + this.categoryOption.legend.data = res.data.category.legend + this.categoryOption.series[0].data = res.data.category.series + this.initCategoryEcharts() + //渲染标签数据 + this.tagOption.legend.data = res.data.tag.legend + this.tagOption.series[0].data = res.data.tag.series + this.initTagEcharts() + //渲染访客地图数据 + let mapData = this.convertData(res.data.cityVisitor) + this.mapOption.series[1].data = mapData + this.mapOption.series[2].data = mapData.splice(0, 5) + this.initMapEcharts() + //渲染一周访问量数据 + this.visitRecordOption.xAxis.data = res.data.visitRecord.date + this.visitRecordOption.series[0].data = res.data.visitRecord.pv + this.visitRecordOption.series[1].data = res.data.visitRecord.uv + this.initVisitRecordEcharts() }) }, initCategoryEcharts() { diff --git a/blog-cms/src/views/log/ExceptionLog.vue b/blog-cms/src/views/log/ExceptionLog.vue index 4f936aa7f..ea7ced37e 100644 --- a/blog-cms/src/views/log/ExceptionLog.vue +++ b/blog-cms/src/views/log/ExceptionLog.vue @@ -26,8 +26,8 @@ - - + + @@ -94,10 +94,8 @@ query.date = query.date[0] + ',' + query.date[1] } getExceptionLogList(query).then(res => { - if (res.code === 200) { - this.logList = res.data.list - this.total = res.data.total - } + this.logList = res.data.list + this.total = res.data.total }) }, handleSizeChange(newSize) { @@ -110,10 +108,8 @@ }, deleteLogById(id) { deleteExceptionLogById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) }, showDetail(error) { diff --git a/blog-cms/src/views/log/LoginLog.vue b/blog-cms/src/views/log/LoginLog.vue index 15351f145..a7c0bf906 100644 --- a/blog-cms/src/views/log/LoginLog.vue +++ b/blog-cms/src/views/log/LoginLog.vue @@ -13,8 +13,8 @@ - - + + @@ -73,10 +73,8 @@ query.date = query.date[0] + ',' + query.date[1] } getLoginLogList(query).then(res => { - if (res.code === 200) { - this.logList = res.data.list - this.total = res.data.total - } + this.logList = res.data.list + this.total = res.data.total }) }, handleSizeChange(newSize) { @@ -89,10 +87,8 @@ }, deleteLogById(id) { deleteLoginLogById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) }, search() { diff --git a/blog-cms/src/views/log/OperationLog.vue b/blog-cms/src/views/log/OperationLog.vue index da0840fb6..ae153e0f6 100644 --- a/blog-cms/src/views/log/OperationLog.vue +++ b/blog-cms/src/views/log/OperationLog.vue @@ -26,9 +26,9 @@ - - - + + + @@ -85,10 +85,8 @@ query.date = query.date[0] + ',' + query.date[1] } getOperationLogList(query).then(res => { - if (res.code === 200) { - this.logList = res.data.list - this.total = res.data.total - } + this.logList = res.data.list + this.total = res.data.total }) }, handleSizeChange(newSize) { @@ -101,10 +99,8 @@ }, deleteLogById(id) { deleteOperationLogById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) }, search() { diff --git a/blog-cms/src/views/log/ScheduleJobLog.vue b/blog-cms/src/views/log/ScheduleJobLog.vue index cfc851a46..b9f3c4819 100644 --- a/blog-cms/src/views/log/ScheduleJobLog.vue +++ b/blog-cms/src/views/log/ScheduleJobLog.vue @@ -12,11 +12,10 @@ - - - - - + + + + - - - - + + + @@ -100,10 +102,8 @@ query.date = query.date[0] + ',' + query.date[1] } getVisitLogList(query).then(res => { - if (res.code === 200) { - this.logList = res.data.list - this.total = res.data.total - } + this.logList = res.data.list + this.total = res.data.total }) }, handleSizeChange(newSize) { @@ -116,10 +116,8 @@ }, deleteLogById(id) { deleteVisitLogById(id).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) }, search() { diff --git a/blog-cms/src/views/login/index.vue b/blog-cms/src/views/login/index.vue index e83a6984e..d39f19a0d 100644 --- a/blog-cms/src/views/login/index.vue +++ b/blog-cms/src/views/login/index.vue @@ -83,12 +83,10 @@ if (valid) { this.loading = true login(this.loginForm).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg); - window.localStorage.setItem('token', res.data.token) - window.localStorage.setItem('user', JSON.stringify(res.data.user)) - this.$router.push('/') - } + this.msgSuccess(res.msg); + window.localStorage.setItem('token', res.data.token) + window.localStorage.setItem('user', JSON.stringify(res.data.user)) + this.$router.push('/') }) this.loading = false } diff --git a/blog-cms/src/views/page/About.vue b/blog-cms/src/views/page/About.vue index 06f53cfbb..7d8baa4d5 100644 --- a/blog-cms/src/views/page/About.vue +++ b/blog-cms/src/views/page/About.vue @@ -55,12 +55,10 @@ methods: { getData() { getAbout().then(res => { - if (res.code === 200) { - this.form.title = res.data.title - this.form.musicId = res.data.musicId - this.form.content = res.data.content - this.form.commentEnabled = res.data.commentEnabled === 'true' ? true : false - } + this.form.title = res.data.title + this.form.musicId = res.data.musicId + this.form.content = res.data.content + this.form.commentEnabled = res.data.commentEnabled === 'true' ? true : false }) }, submit() { @@ -72,9 +70,7 @@ return this.msgError("歌曲ID有误") } updateAbout(this.form).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - } + this.msgSuccess(res.msg) }) } else { return this.msgError('请填写必要的表单') diff --git a/blog-cms/src/views/page/FriendList.vue b/blog-cms/src/views/page/FriendList.vue index 2ab1bab93..cb4fc2627 100644 --- a/blog-cms/src/views/page/FriendList.vue +++ b/blog-cms/src/views/page/FriendList.vue @@ -14,7 +14,7 @@ @@ -164,32 +164,24 @@ methods: { getInfo() { getFriendInfo().then(res => { - if (res.code === 200) { - this.infoForm = res.data - } + this.infoForm = res.data }) }, updateContent() { updateContent(this.infoForm.content).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getInfo() - } + this.msgSuccess(res.msg) + this.getInfo() }) }, commentEnabledChanged() { updateCommentEnabled(this.infoForm.commentEnabled).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - } + this.msgSuccess(res.msg) }) }, getFriendList() { getFriendsByQuery(this.queryInfo).then(res => { - if (res.code === 200) { - this.friendList = res.data.list - this.total = res.data.total - } + this.friendList = res.data.list + this.total = res.data.total }) }, handleSizeChange(newSize) { @@ -202,17 +194,13 @@ }, friendPublishedChanged(row) { updatePublished(row.id, row.published).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - } + this.msgSuccess(res.msg) }) }, deleteFriendById(id) { deleteFriendById(id).then(res => { - if (res.code === 200) { - this.getFriendList() - this.msgSuccess(res.msg) - } + this.getFriendList() + this.msgSuccess(res.msg) }) }, showEditDialog(row) { @@ -230,11 +218,9 @@ this.$refs.addFormRef.validate(valid => { if (valid) { saveFriend(this.addForm).then(res => { - if (res.code === 200) { - this.getFriendList() - this.msgSuccess(res.msg) - this.addDialogVisible = false - } + this.getFriendList() + this.msgSuccess(res.msg) + this.addDialogVisible = false }) } }) @@ -243,11 +229,9 @@ this.$refs.editFormRef.validate(valid => { if (valid) { updateFriend(this.editForm).then(res => { - if (res.code === 200) { - this.getFriendList() - this.msgSuccess(res.msg) - this.editDialogVisible = false - } + this.getFriendList() + this.msgSuccess(res.msg) + this.editDialogVisible = false }) } }) diff --git a/blog-cms/src/views/page/SiteSetting.vue b/blog-cms/src/views/page/SiteSetting.vue index 423edfb28..bf456e346 100644 --- a/blog-cms/src/views/page/SiteSetting.vue +++ b/blog-cms/src/views/page/SiteSetting.vue @@ -8,7 +8,7 @@
- + @@ -19,17 +19,17 @@ 资料卡
- +
- + - 删除 + 删除
- +
添加自定义 @@ -43,24 +43,24 @@
页脚徽标
- + - + - + - + - + - + - 删除 + 删除 添加 badge @@ -93,29 +93,27 @@ methods: { getData() { getSiteSettingData().then(res => { - if (res.code === 200) { - this.typeMap = res.data - res.data.type2.forEach(item => { - item.value = JSON.parse(item.value) - }) - } + this.typeMap = res.data + res.data.type3.forEach(item => { + item.value = JSON.parse(item.value) + }) }) }, addFavorite() { - this.typeMap.type3.push({ + this.typeMap.type2.push({ key: Date.now(), nameEn: "favorite", nameZh: "自定义", - type: 3, + type: 2, value: "{\"title\":\"\",\"content\":\"\"}" }) }, addBadge() { - this.typeMap.type2.push({ + this.typeMap.type3.push({ key: Date.now(), nameEn: "badge", nameZh: "徽标", - type: 2, + type: 3, value: { color: "", subject: "", @@ -126,7 +124,7 @@ }) }, deleteFavorite(favorite) { - let arr = this.typeMap.type3 + let arr = this.typeMap.type2 if (favorite.id) { this.deleteIds.push(favorite.id) arr.forEach((item, index) => { @@ -145,7 +143,7 @@ } }, deleteBadge(badge) { - let arr = this.typeMap.type2 + let arr = this.typeMap.type3 if (badge.id) { this.deleteIds.push(badge.id) arr.forEach((item, index) => { @@ -165,7 +163,7 @@ }, submit() { const result = _.cloneDeep(this.typeMap) - result.type2.forEach(item => { + result.type3.forEach(item => { item.value = JSON.stringify(item.value) }) let updateArr = [] @@ -173,11 +171,9 @@ updateArr.push(...result.type2) updateArr.push(...result.type3) update(updateArr, this.deleteIds).then(res => { - if (res.code === 200) { - this.deleteIds = [] - this.getData() - this.msgSuccess(res.msg) - } + this.deleteIds = [] + this.getData() + this.msgSuccess(res.msg) }) } } diff --git a/blog-cms/src/views/pictureHosting/Manage.vue b/blog-cms/src/views/pictureHosting/GithubManage.vue similarity index 97% rename from blog-cms/src/views/pictureHosting/Manage.vue rename to blog-cms/src/views/pictureHosting/GithubManage.vue index c743148c3..83d4c7aa9 100644 --- a/blog-cms/src/views/pictureHosting/Manage.vue +++ b/blog-cms/src/views/pictureHosting/GithubManage.vue @@ -62,7 +62,7 @@ import {taskQueue} from "@/util/task-queue"; export default { - name: "Manage", + name: "GithubManage", components: {SvgIcon}, data() { return { @@ -169,11 +169,11 @@ localStorage.setItem(`hintShow${id}`, '1') }, imgUrl(file) { - return this.isCDN ? `https://cdn.jsdelivr.net/gh/${this.userInfo.login}/${this.activeRepos}/${file.path}` : file.download_url + return this.isCDN ? `https://fastly.jsdelivr.net/gh/${this.userInfo.login}/${this.activeRepos}/${file.path}` : file.download_url }, copy(type, file) { // type 1 cdn link 2 Markdown - let imgUrl = `https://cdn.jsdelivr.net/gh/${this.userInfo.login}/${this.activeRepos}/${file.path}` + let imgUrl = `https://fastly.jsdelivr.net/gh/${this.userInfo.login}/${this.activeRepos}/${file.path}` let copyCont = imgUrl if (type == 2) { copyCont = `![${file.name}](${imgUrl})` diff --git a/blog-cms/src/views/pictureHosting/Setting.vue b/blog-cms/src/views/pictureHosting/Setting.vue index 11923f66a..0441ca6ae 100644 --- a/blog-cms/src/views/pictureHosting/Setting.vue +++ b/blog-cms/src/views/pictureHosting/Setting.vue @@ -1,97 +1,210 @@ - \ No newline at end of file +.middle { + vertical-align: middle; +} + +.el-card { + width: 50%; +} + +.el-card + .el-card { + margin-top: 20px; +} + diff --git a/blog-cms/src/views/pictureHosting/TxyunManage.vue b/blog-cms/src/views/pictureHosting/TxyunManage.vue new file mode 100644 index 000000000..c2536b8a6 --- /dev/null +++ b/blog-cms/src/views/pictureHosting/TxyunManage.vue @@ -0,0 +1,384 @@ + + + + + + + diff --git a/blog-cms/src/views/pictureHosting/UpyunManage.vue b/blog-cms/src/views/pictureHosting/UpyunManage.vue new file mode 100644 index 000000000..7ee76e949 --- /dev/null +++ b/blog-cms/src/views/pictureHosting/UpyunManage.vue @@ -0,0 +1,339 @@ + + + + + + + \ No newline at end of file diff --git a/blog-cms/src/views/statistics/Visitor.vue b/blog-cms/src/views/statistics/Visitor.vue index 1790504a3..f0f60421a 100644 --- a/blog-cms/src/views/statistics/Visitor.vue +++ b/blog-cms/src/views/statistics/Visitor.vue @@ -12,10 +12,10 @@ - - - - + + + + @@ -80,10 +80,8 @@ query.date = query.date[0] + ',' + query.date[1] } getVisitorList(query).then(res => { - if (res.code === 200) { - this.visitorList = res.data.list - this.total = res.data.total - } + this.visitorList = res.data.list + this.total = res.data.total }) }, handleSizeChange(newSize) { @@ -96,10 +94,8 @@ }, deleteVisitorById(visitor) { deleteVisitor(visitor.id, visitor.uuid).then(res => { - if (res.code === 200) { - this.msgSuccess(res.msg) - this.getData() - } + this.msgSuccess(res.msg) + this.getData() }) }, showLog(uuid) { diff --git a/blog-cms/src/views/system/Account.vue b/blog-cms/src/views/system/Account.vue new file mode 100644 index 000000000..924b2301f --- /dev/null +++ b/blog-cms/src/views/system/Account.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/blog-cms/src/views/system/ScheduleJobList.vue b/blog-cms/src/views/system/ScheduleJobList.vue index 7e2f0d1b9..b1720107d 100644 --- a/blog-cms/src/views/system/ScheduleJobList.vue +++ b/blog-cms/src/views/system/ScheduleJobList.vue @@ -10,11 +10,11 @@ - - + + - +