diff --git a/.eslintrc b/.eslintrc index 3eed71dc..aa750a50 100644 --- a/.eslintrc +++ b/.eslintrc @@ -16,7 +16,8 @@ "no-multiple-empty-lines": [1, {"max": 2}], "comma-dangle": [2, "always-multiline"], "standard/no-callback-literal": "off", - "prefer-const": "off" + "prefer-const": "off", + "no-labels": "off" }, "settings": { "html/html-extensions": [".html", ".vue"] diff --git a/.github/workflows/beta-pack.yml b/.github/workflows/beta-pack.yml index df61f73d..31ae7527 100644 --- a/.github/workflows/beta-pack.yml +++ b/.github/workflows/beta-pack.yml @@ -124,8 +124,8 @@ jobs: - name: Build Package dmg run: | - npm run publish:mac:dmg - npm run publish:mac:dmg:arm64 + npm run pack:mac:dmg + npm run pack:mac:dmg:arm64 env: ELECTRON_CACHE: $HOME/.cache/electron ELECTRON_BUILDERCACHE: $HOME/.cache/electron-builder diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f458c9a..6c734023 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,21 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/). Commit convention is based on [Conventional Commits](http://conventionalcommits.org). Change log format is based on [Keep a Changelog](http://keepachangelog.com/). +## [1.12.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.11.0...v1.12.0) - 2021-08-08 + +### 新增 + +- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看"常见问题"。 + +### 优化 + +- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了 + +### 修复 + +- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌 +- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题 + ## [1.11.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.10.2...v1.11.0) - 2021-07-18 ### 新增 diff --git a/FAQ.md b/FAQ.md index 1204b48b..e2a9e343 100644 --- a/FAQ.md +++ b/FAQ.md @@ -78,6 +78,99 @@ 对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况,请阅读下面的 **软件启动后,界面无法显示** 解决。 + +# lx-music-mobile 常见问题 + +在阅读本常见问题后,仍然无法解决你的问题,请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题! + +## 歌曲无法试听与下载 + +### 所有歌曲都提示 `请求异常😮,可以多试几次,若还是不行就换一首吧。。。` + +尝试更换网络,如切换到移动网络,若移动网络还是不行则尝试开关下手机的飞行模式后再试,
+若使用家庭网络的话,可尝试将光猫断电5分钟左右再通电联网后播放。 + +### 其他情况 + +尝试在在浏览器打开这个地址`http://ts.tempmusic.tk`,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器,对于此类情况请尝试切换其他网络。 + +### 通用解决方法 + +尝试按以下顺序解决: + +1. 尝试更新到最新版本 +2. 尝试切换其他歌曲(或直接搜索该歌曲),若全部歌曲都无法试听与下载则进行下一步 +3. 尝试到 设置-音乐来源 切换到其他接口 +4. 尝试切换网络,比如用手机开热点(所有歌曲都提示请求异常时可通过此方法解决,或等一两天后再试) +5. 若还不行请到这个链接查看详情: +6. 若没有在第5条链接中的第一条评论中看到接口无法使用的说明,则应该是你网络无法访问接口服务器的问题,如果接口有问题我会在那里说明。 + +想要知道是不是自己网络的问题可以看看`http://ts.tempmusic.tk`能不能在浏览器打开,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器。 +若网页无法打开或打来不是404,则应该是DNS的问题,可以尝试以下办法: + +1. 将DNS改成自动获取试试 +2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`114.114.114.114`、`8.8.8.8` + +## 列表多选 + +长按列表将会进入多选模式。 + +- 例子一:想要选中1-5项,进入多选模式后,取消所有选中的内容,切换到区间,点击第一项,再点击第五项即可完成选择; +- 例子二:想要选中1项与第3项,进入多选模式后,点击第一项,再点击第三项即可完成选择; +- 例子三:想要选中当前列表的全部内容,进入多选模式后,点击全选即可完成选择(注:由于**在线列表**使用分页加载,全选只会选择目前已加载的内容,若要完整选择整个在线列表的内容则需要往下滑动将列表加载完毕再进行全选)。 + +注:选完后可用歌曲列表三个点的菜单操作已选的内容 + +## 无法打开外部歌单 + +不支持垮源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);
+对于分享出来的歌单,若打开失败,可尝试先在浏览器中打开后,再从浏览器地址栏复制URL地址到软件打开;
+或者如果你知道歌单 id 也可以直接输入歌单 id 打开。
+ +注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开 + +## 播放整个歌单或排行榜 + +播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。 + +## 无法打开外部歌单 + +不支持垮源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);
+对于分享出来的歌单,若打开失败,可尝试先在浏览器中打开后,再从浏览器地址栏复制URL地址到软件打开;
+或者如果你知道歌单 id 也可以直接输入歌单 id 打开。
+ + +## 同步功能的使用(实验性,首次使用前建议先备份一次列表) + +**注意:由于同步传输时的数据是明文传输,请在受信任的网络下使用此功能!**
+此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用方法: + +1. 在PC端的设置-数据同步开启同步功能(这时如果出现安全软件、防火墙等提示网络连接弹窗时需要点击允许) +2. 在移动端的设置-同步-同步服务器地址输入PC端显示的同步服务器地址(如果显示可以多个,则输入与**移动端上显示的本机地址**最相似的那个),端口号与PC端的同步端口一致 +3. 输入完这两项后点击“启动同步” +4. 若连接成功,对于首次同步时,若两边的设备的列表不为空,则PC端会弹出选择列表同步方式的弹窗,同步方式的说明弹窗下面有介绍 + +对于连接同步失败的可能原因: + +- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用 +- 路由器若开启了AP隔离,则此功能无法使用 +- 检查防火墙是否拦截了PC端的服务端口 + +## 更新已收藏的在线歌单 + +该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能, + +需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。 + +## 杀毒软件提示有病毒或恶意行为 + +本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为,并且软件代码已开源,请自行查阅,软件安装包也是由CI拉取源代码构建,构建日志:[GitHub Actions](https://github.com/lyswhut/lx-music-mobile/actions)
+尽管如此,但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。
+当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。 + +最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件! + + ### Linux 下界面异常 根据Electron里issue的[解决方案](https://github.com/electron/electron/issues/2170#issuecomment-736223269),
diff --git a/build-config/renderer-lyric/webpack.config.base.js b/build-config/renderer-lyric/webpack.config.base.js index dd9ba8ea..839149aa 100644 --- a/build-config/renderer-lyric/webpack.config.base.js +++ b/build-config/renderer-lyric/webpack.config.base.js @@ -97,26 +97,38 @@ module.exports = { }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'imgs/[name]--[folder].[ext]', + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'imgs/[name]-[contenthash:8][ext]', }, }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'media/[name]--[folder].[ext]', + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'media/[name]-[contenthash:8][ext]', }, }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'fonts/[name]--[folder].[ext]', + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'fonts/[name]-[contenthash:8][ext]', }, }, ], diff --git a/build-config/renderer/webpack.config.base.js b/build-config/renderer/webpack.config.base.js index 5d330a53..f9ba81db 100644 --- a/build-config/renderer/webpack.config.base.js +++ b/build-config/renderer/webpack.config.base.js @@ -97,26 +97,38 @@ module.exports = { }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'imgs/[name]--[folder].[ext]', + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'imgs/[name]-[contenthash:8][ext]', }, }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'media/[name]--[folder].[ext]', + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'media/[name]-[contenthash:8][ext]', }, }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'fonts/[name]--[folder].[ext]', + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'fonts/[name]-[contenthash:8][ext]', }, }, ], diff --git a/package-lock.json b/package-lock.json index 2adfe7b4..1e0399b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.10.2", + "version": "1.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -20,26 +20,26 @@ } }, "@babel/compat-data": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz", - "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", "dev": true }, "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -58,12 +58,12 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -88,6 +88,52 @@ "@babel/types": "^7.14.5" } }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.8" + } + }, "@babel/helper-split-export-declaration": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", @@ -98,9 +144,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { @@ -115,9 +161,9 @@ } }, "@babel/parser": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", - "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", "dev": true }, "@babel/template": { @@ -132,29 +178,29 @@ } }, "@babel/traverse": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", - "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.15.0", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -221,30 +267,30 @@ }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.5", + "@babel/compat-data": "^7.15.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -395,12 +441,12 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -441,9 +487,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { @@ -458,9 +504,9 @@ } }, "@babel/parser": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz", - "integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", "dev": true }, "@babel/template": { @@ -475,29 +521,29 @@ } }, "@babel/traverse": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", - "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.15.0", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -524,18 +570,18 @@ }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } } @@ -826,18 +872,18 @@ }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } } @@ -1015,18 +1061,18 @@ }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } } @@ -1075,12 +1121,12 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -1115,9 +1161,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { @@ -1132,9 +1178,9 @@ } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", "dev": true }, "@babel/template": { @@ -1149,29 +1195,29 @@ } }, "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.15.0", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -1189,14 +1235,14 @@ } }, "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", "dev": true, "requires": { "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" }, "dependencies": { "@babel/code-frame": { @@ -1209,12 +1255,12 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -1249,9 +1295,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { @@ -1266,9 +1312,9 @@ } }, "@babel/parser": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz", - "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", "dev": true }, "@babel/template": { @@ -1283,29 +1329,29 @@ } }, "@babel/traverse": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz", - "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.15.0", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -1372,9 +1418,9 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz", + "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", @@ -1548,12 +1594,6 @@ "@babel/plugin-transform-parameters": "^7.14.5" }, "dependencies": { - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "dev": true - }, "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", @@ -1900,9 +1940,9 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", + "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.14.5", @@ -1959,9 +1999,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { @@ -1976,9 +2016,9 @@ } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", "dev": true }, "@babel/template": { @@ -1993,12 +2033,12 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -2165,9 +2205,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/highlight": { @@ -2182,9 +2222,9 @@ } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", "dev": true }, "@babel/template": { @@ -2199,12 +2239,12 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -2275,22 +2315,189 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz", + "integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-module-transforms": "^7.15.0", "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", + "dev": true + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } } } }, @@ -2314,9 +2521,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true } } @@ -2340,9 +2547,9 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", - "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.14.5" @@ -2444,9 +2651,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz", + "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.14.5", @@ -2605,17 +2812,17 @@ } }, "@babel/preset-env": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", - "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz", + "integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-async-generator-functions": "^7.14.9", "@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-class-static-block": "^7.14.5", "@babel/plugin-proposal-dynamic-import": "^7.14.5", @@ -2648,7 +2855,7 @@ "@babel/plugin-transform-async-to-generator": "^7.14.5", "@babel/plugin-transform-block-scoped-functions": "^7.14.5", "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.9", "@babel/plugin-transform-computed-properties": "^7.14.5", "@babel/plugin-transform-destructuring": "^7.14.7", "@babel/plugin-transform-dotall-regex": "^7.14.5", @@ -2659,10 +2866,10 @@ "@babel/plugin-transform-literals": "^7.14.5", "@babel/plugin-transform-member-expression-literals": "^7.14.5", "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.0", "@babel/plugin-transform-modules-systemjs": "^7.14.5", "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", "@babel/plugin-transform-new-target": "^7.14.5", "@babel/plugin-transform-object-super": "^7.14.5", "@babel/plugin-transform-parameters": "^7.14.5", @@ -2677,20 +2884,14 @@ "@babel/plugin-transform-unicode-escapes": "^7.14.5", "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.0", "babel-plugin-polyfill-corejs2": "^0.2.2", "babel-plugin-polyfill-corejs3": "^0.2.2", "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", + "core-js-compat": "^3.16.0", "semver": "^6.3.0" }, "dependencies": { - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "dev": true - }, "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", @@ -2698,38 +2899,20 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } - }, - "core-js-compat": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.1.tgz", - "integrity": "sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } } } }, @@ -2747,9 +2930,9 @@ } }, "@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -2896,9 +3079,9 @@ } }, "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2925,9 +3108,9 @@ } }, "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -3068,6 +3251,21 @@ "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", "dev": true }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, "@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", @@ -3146,8 +3344,7 @@ "@types/node": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", - "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", - "dev": true + "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -3194,21 +3391,44 @@ "dev": true }, "@vue/component-compiler-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.1.tgz", - "integrity": "sha512-Mci9WJYLRjyJEBkGHMPxZ1ihJ9l6gOy2Gr6hpYZUNpQoe5+nbpeb3w00aP+PSHJygCF+fxJsqp7Af1zGDITzuw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz", + "integrity": "sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==", "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", "source-map": "~0.6.1", "vue-template-es2015-compiler": "^1.9.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -3219,12 +3439,32 @@ "yallist": "^2.1.2" } }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -3416,7 +3656,6 @@ "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" @@ -3428,10 +3667,16 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, + "acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "dev": true + }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "aggregate-error": { @@ -3569,6 +3814,11 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "app-builder-bin": { "version": "3.5.13", "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.13.tgz", @@ -3892,100 +4142,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-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" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -4000,82 +4156,12 @@ "resolve": "^1.12.0" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helper-evaluate-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz", - "integrity": "sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw==", - "dev": true - }, - "babel-helper-flip-expressions": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz", - "integrity": "sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw==", - "dev": true - }, "babel-helper-is-nodes-equiv": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", "dev": true }, - "babel-helper-is-void-0": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz", - "integrity": "sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ==", - "dev": true - }, - "babel-helper-mark-eval-scopes": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz", - "integrity": "sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ==", - "dev": true - }, - "babel-helper-remove-or-void": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz", - "integrity": "sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ==", - "dev": true - }, - "babel-helper-to-multiple-sequence-expressions": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz", - "integrity": "sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw==", - "dev": true - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, "babel-loader": { "version": "8.2.2", "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1606424508891&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz", @@ -4153,59 +4239,6 @@ } } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-minify-webpack-plugin": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-minify-webpack-plugin/-/babel-minify-webpack-plugin-0.3.1.tgz", - "integrity": "sha512-Johg6Ju0Gxevk2R55eutMqnyXwlyUzCtwunBpiyNzoxGnKum+x5nfNuYZYHGd5Bmc1gmhjwzb7GkxHWOtYWmtQ==", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-preset-minify": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "babel-preset-minify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz", - "integrity": "sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ==", - "dev": true, - "requires": { - "babel-plugin-minify-builtins": "^0.3.0", - "babel-plugin-minify-constant-folding": "^0.3.0", - "babel-plugin-minify-dead-code-elimination": "^0.3.0", - "babel-plugin-minify-flip-comparisons": "^0.3.0", - "babel-plugin-minify-guarded-expressions": "^0.3.0", - "babel-plugin-minify-infinity": "^0.3.0", - "babel-plugin-minify-mangle-names": "^0.3.0", - "babel-plugin-minify-numeric-literals": "^0.3.0", - "babel-plugin-minify-replace": "^0.3.0", - "babel-plugin-minify-simplify": "^0.3.0", - "babel-plugin-minify-type-constructors": "^0.3.0", - "babel-plugin-transform-inline-consecutive-adds": "^0.3.0", - "babel-plugin-transform-member-expression-literals": "^6.9.0", - "babel-plugin-transform-merge-sibling-variables": "^6.9.0", - "babel-plugin-transform-minify-booleans": "^6.9.0", - "babel-plugin-transform-property-literals": "^6.9.0", - "babel-plugin-transform-regexp-constructors": "^0.3.0", - "babel-plugin-transform-remove-console": "^6.9.0", - "babel-plugin-transform-remove-debugger": "^6.9.0", - "babel-plugin-transform-remove-undefined": "^0.3.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.0", - "babel-plugin-transform-undefined-to-void": "^6.9.0", - "lodash.isplainobject": "^4.0.6" - } - } - } - }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -4215,101 +4248,6 @@ "object.assign": "^4.1.0" } }, - "babel-plugin-minify-builtins": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz", - "integrity": "sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.3.0" - } - }, - "babel-plugin-minify-constant-folding": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz", - "integrity": "sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.3.0" - } - }, - "babel-plugin-minify-dead-code-elimination": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz", - "integrity": "sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.3.0", - "babel-helper-mark-eval-scopes": "^0.3.0", - "babel-helper-remove-or-void": "^0.3.0", - "lodash.some": "^4.6.0" - } - }, - "babel-plugin-minify-flip-comparisons": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz", - "integrity": "sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw==", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.3.0" - } - }, - "babel-plugin-minify-guarded-expressions": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz", - "integrity": "sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA==", - "dev": true, - "requires": { - "babel-helper-flip-expressions": "^0.3.0" - } - }, - "babel-plugin-minify-infinity": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz", - "integrity": "sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ==", - "dev": true - }, - "babel-plugin-minify-mangle-names": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz", - "integrity": "sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q==", - "dev": true, - "requires": { - "babel-helper-mark-eval-scopes": "^0.3.0" - } - }, - "babel-plugin-minify-numeric-literals": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz", - "integrity": "sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg==", - "dev": true - }, - "babel-plugin-minify-replace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz", - "integrity": "sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg==", - "dev": true - }, - "babel-plugin-minify-simplify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz", - "integrity": "sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q==", - "dev": true, - "requires": { - "babel-helper-flip-expressions": "^0.3.0", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.3.0" - } - }, - "babel-plugin-minify-type-constructors": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz", - "integrity": "sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q==", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.3.0" - } - }, "babel-plugin-polyfill-corejs2": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", @@ -4322,13 +4260,13 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz", - "integrity": "sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.9.1" + "core-js-compat": "^3.14.0" } }, "babel-plugin-polyfill-regenerator": { @@ -4340,12 +4278,6 @@ "@babel/helper-define-polyfill-provider": "^0.2.2" } }, - "babel-plugin-transform-inline-consecutive-adds": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz", - "integrity": "sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA==", - "dev": true - }, "babel-plugin-transform-member-expression-literals": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", @@ -4373,12 +4305,6 @@ "esutils": "^2.0.2" } }, - "babel-plugin-transform-regexp-constructors": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz", - "integrity": "sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw==", - "dev": true - }, "babel-plugin-transform-remove-console": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", @@ -4391,15 +4317,6 @@ "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=", "dev": true }, - "babel-plugin-transform-remove-undefined": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz", - "integrity": "sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.3.0" - } - }, "babel-plugin-transform-simplify-comparison-operators": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", @@ -4602,126 +4519,6 @@ } } }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, "babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -4750,12 +4547,6 @@ } } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -4777,6 +4568,11 @@ "pascalcase": "^0.1.1" } }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4784,6 +4580,11 @@ "dev": true, "optional": true }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -4908,9 +4709,7 @@ "boolean": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.2.tgz", - "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==", - "dev": true, - "optional": true + "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==" }, "boxen": { "version": "5.0.1", @@ -4962,22 +4761,22 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", + "caniuse-lite": "^1.0.30001248", "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "electron-to-chromium": "^1.3.793", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.73" }, "dependencies": { "caniuse-lite": { - "version": "1.0.30001228", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", - "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "version": "1.0.30001248", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", + "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==", "dev": true } } @@ -5017,6 +4816,14 @@ "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", "dev": true }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, "builder-util": { "version": "22.11.7", "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.11.7.tgz", @@ -5160,6 +4967,15 @@ "unset-value": "^1.0.0" } }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npm.taobao.org/cacheable-request/download/cacheable-request-6.1.0.tgz", @@ -5266,9 +5082,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -5570,6 +5386,11 @@ "mimic-response": "^1.0.0" } }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -5636,8 +5457,7 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "compressible": { "version": "2.0.18", @@ -5822,7 +5642,6 @@ "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" }, @@ -5830,21 +5649,19 @@ "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 + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" } } }, "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 + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -5870,6 +5687,22 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "copy-anything": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", @@ -6016,15 +5849,15 @@ } }, "core-js": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz", - "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", + "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", "dev": true }, "core-js-compat": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.14.0.tgz", - "integrity": "sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.0.tgz", + "integrity": "sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q==", "dev": true, "requires": { "browserslist": "^4.16.6", @@ -6044,6 +5877,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", @@ -6102,9 +5944,9 @@ } }, "crypto-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", - "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, "crypto-random-string": { "version": "2.0.0", @@ -6148,69 +5990,21 @@ } }, "css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz", + "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", "postcss": "^8.2.15", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", "semver": "^7.3.5" }, "dependencies": { - "@types/json-schema": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", - "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6492,6 +6286,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, "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=1598471816842&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-4.2.0.tgz", @@ -6512,7 +6311,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -6556,31 +6354,30 @@ } } }, + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==" + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-node": { "version": "2.0.4", @@ -6859,8 +6656,12 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "eiows": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eiows/-/eiows-3.6.1.tgz", + "integrity": "sha512-BvTdSAMiRZ7+2xpJNJ+Q6pCbH83ZwJf1kXKKaSPsj297IIUpiY8t6YpvAZKxZet6Ags9okWuCEGu9el+0HKnHg==" }, "ejs": { "version": "3.1.6", @@ -6872,9 +6673,9 @@ } }, "electron": { - "version": "13.1.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.1.7.tgz", - "integrity": "sha512-sVfpP/0s6a82FK32LMuEe9L+aWZw15u3uYn9xUJArPjy4OZHteE6yM5871YCNXNiDnoCLQ5eqQWipiVgHsf8nQ==", + "version": "13.1.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.1.8.tgz", + "integrity": "sha512-ei2ZyyG81zUOlvm5Zxri668TdH5GNLY0wF+XrC2FRCqa8AABAPjJIWTRkhFEr/H6PDVPNZjMPvSs3XhHyVVk2g==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -6883,9 +6684,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", - "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==", + "version": "14.17.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.9.tgz", + "integrity": "sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g==", "dev": true } } @@ -7028,9 +6829,9 @@ } }, "electron-log": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.3.5.tgz", - "integrity": "sha512-J5Ew3axdk7W4jzzxKLSAi1sqbcAoo9CzHuBVsG0tT47j256xKulNrWFf3lZmHJ1KDXOQUcuwOngQF0jjmpEdpw==" + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.1.tgz", + "integrity": "sha512-nK/DwxPLtwWbggPCm27eMQhYHc3gzoZ+cokBK99diO4WsZJKrv5l44EUW8mRfWpmC8ZubnMyp6GTUIJyTc9AJA==" }, "electron-publish": { "version": "22.11.7", @@ -7117,9 +6918,9 @@ } }, "electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==", + "version": "1.3.796", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.796.tgz", + "integrity": "sha512-agwJFgM0FUC1UPPbQ4aII3HamaaJ09fqWGAWYHmzxDWqdmTleCHyyA0kt3fJlTd5M440IaeuBfzXzXzCotnZcQ==", "dev": true }, "electron-updater": { @@ -7199,8 +7000,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { "version": "1.4.4", @@ -7211,6 +7011,48 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz", + "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + } + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, "enhanced-resolve": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", @@ -7222,9 +7064,9 @@ }, "dependencies": { "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true } } @@ -7375,8 +7217,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -7385,13 +7226,13 @@ "dev": true }, "eslint": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", - "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", + "@eslint/eslintrc": "^0.4.3", "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -7442,9 +7283,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", + "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", "dev": true }, "@babel/highlight": { @@ -7502,9 +7343,9 @@ "dev": true }, "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -8522,12 +8363,31 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-json-stringify": { + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.7.tgz", + "integrity": "sha512-2kiwC/hBlK7QiGALsvj0QxtYwaReLOmAwOWJIxt5WHBB9EwXsqbsu8LCel47yh8NV8CEcFmnZYcXh4BionJcwQ==", + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-printf": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.6.tgz", + "integrity": "sha512-Uz/uW6R1Fd8YqCGeoQosRIfB4dBbr8uMbFVdEci2AyXYcfucFqhpSMAGs8skRRdZd+MGCDBu48+B8Zmu7Pta5A==", + "requires": { + "boolean": "^3.0.2" + } + }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -8698,9 +8558,9 @@ } }, "flatted": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz", - "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "follow-redirects": { @@ -8748,8 +8608,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "friendly-errors-webpack-plugin": { "version": "1.7.0", @@ -8988,8 +8847,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "optional": true, "requires": { "define-properties": "^1.1.3" } @@ -9164,16 +9021,6 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -9261,6 +9108,22 @@ "entities": "^2.0.0" } }, + "http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "dependencies": { + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + } + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz", @@ -9277,7 +9140,6 @@ "version": "1.7.2", "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407647372&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", @@ -9289,8 +9151,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -9428,6 +9289,43 @@ "sshpk": "^1.7.0" } }, + "http-terminator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/http-terminator/-/http-terminator-3.0.0.tgz", + "integrity": "sha512-YdNsDQgsHuxBSOWWhkQHMgOD7c5CU3e9u+pokp9tI6BwJ8LjUhJYBO+k2a3NXoDXbToSm7OQk4RzNTooPQP5IQ==", + "requires": { + "delay": "^5.0.0", + "roarr": "^4.0.10", + "type-fest": "^0.20.2" + }, + "dependencies": { + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "roarr": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-4.2.5.tgz", + "integrity": "sha512-ZSs1hr2gyWickWDr2Yw0qcuef+EJKwZtNxUj7poxvIDxVq+ZvQreVNdPVLHonWpavBeZaOcAGVFV5xM/HqRR8g==", + "requires": { + "boolean": "^3.0.2", + "detect-node": "^2.0.5", + "fast-json-stringify": "^2.5.2", + "fast-printf": "^1.6.4", + "globalthis": "^1.0.2", + "is-circular": "^1.0.2", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -9567,15 +9465,6 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -9660,6 +9549,11 @@ "ci-info": "^3.1.1" } }, + "is-circular": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-circular/-/is-circular-1.0.2.tgz", + "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==" + }, "is-color-stop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", @@ -9739,18 +9633,17 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -10167,6 +10060,14 @@ "integrity": "sha1-iBkexzjOn3WRwl6QVt6Si0AncZQ=", "dev": true }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npm.taobao.org/keyv/download/keyv-3.1.0.tgz?cache=0&sync_timestamp=1600337463601&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkeyv%2Fdownload%2Fkeyv-3.1.0.tgz", @@ -10194,6 +10095,80 @@ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "dev": true }, + "koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, "latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", @@ -10432,12 +10407,6 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -10450,12 +10419,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true - }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -10474,14 +10437,10 @@ "integrity": "sha1-AF/eL15uRwaPk1/yhXPhJe9y8Zc=", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "lower-case": { "version": "2.0.2", @@ -10507,9 +10466,9 @@ "dev": true }, "lrc-file-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.1.0.tgz", - "integrity": "sha512-2C6j7lk2UpUae5+OnnQxXZ81ekg+LPWylAYzpCws3MFPSBqh4U3aA0cfLmjpIyDpKmS4hfNINfJZtt2jFX9peg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.1.2.tgz", + "integrity": "sha512-AUzLhGkriwf0P0bQzLvLYFDXPcfBpwPb124MYySuvdyL9M3QPEPro9jEXD75qxM3MHbRdq2B1bbfKETUqJPPxg==" }, "lru-cache": { "version": "6.0.0", @@ -10544,9 +10503,9 @@ } }, "markdown-it": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", - "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", "dev": true, "requires": { "argparse": "^2.0.1", @@ -10604,8 +10563,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memory-fs": { "version": "0.4.1", @@ -10699,18 +10657,18 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.1.0.tgz", - "integrity": "sha512-SV1GgjMcfqy6hW07rAniUbQE4qS3inh3v4rZEUySkPRWy3vMbS3jUCjMOvNI4lUnDlQYJEmuUqKktTCNY5koFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.0.tgz", + "integrity": "sha512-91HeVHbq7PUJ4TwOuMTlFWfVWrLqf3SF0PlEDPV+wtgsfxrMebN9LLzflyQqdKLp4/H3PexRB1WLKsCqpWKkxQ==", "dev": true, "requires": { - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.0" }, "dependencies": { "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "ajv": { @@ -10732,12 +10690,12 @@ "dev": true }, "schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.7", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -10897,8 +10855,7 @@ "negotiator": { "version": "0.6.2", "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", - "dev": true + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" }, "neo-async": { "version": "2.6.2", @@ -10943,6 +10900,11 @@ "integrity": "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=", "dev": true }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, "node-id3": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/node-id3/-/node-id3-0.2.3.tgz", @@ -10962,9 +10924,9 @@ } }, "node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", "dev": true }, "normalize-package-data": { @@ -11050,8 +11012,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -11146,8 +11107,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -11200,7 +11160,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -11229,6 +11188,11 @@ "mimic-fn": "^2.1.0" } }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", @@ -11261,18 +11225,6 @@ "url-parse": "^1.4.3" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npm.taobao.org/p-cancelable/download/p-cancelable-1.1.0.tgz", @@ -11388,8 +11340,7 @@ "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 + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" }, "pascal-case": { "version": "3.1.2", @@ -11567,9 +11518,9 @@ "dev": true }, "postcss": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", - "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", "dev": true, "requires": { "colorette": "^1.2.2", @@ -11999,12 +11950,6 @@ "renderkid": "^2.0.6" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -12687,15 +12632,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -12821,6 +12757,11 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -12930,9 +12871,7 @@ "semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" }, "semver-diff": { "version": "3.1.1", @@ -13123,8 +13062,7 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", - "dev": true + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" }, "shallow-clone": { "version": "3.0.1", @@ -13156,12 +13094,6 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -13351,6 +13283,57 @@ } } }, + "socket.io": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.3.tgz", + "integrity": "sha512-tLkaY13RcO4nIRh1K2hT5iuotfTaIQw7cVIe0FUykN3SuQi0cm7ALxuyT5/CtDswOMWUzMGTibxYNx/gU7In+Q==", + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.10", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~5.1.1", + "socket.io-adapter": "~2.3.1", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + } + } + }, + "socket.io-adapter": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz", + "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw==" + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + } + } + }, "sockjs": { "version": "0.3.21", "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.21.tgz?cache=0&sync_timestamp=1596167355358&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs%2Fdownload%2Fsockjs-0.3.21.tgz", @@ -13387,12 +13370,6 @@ } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -13418,15 +13395,6 @@ "urix": "^0.1.0" } }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -13675,8 +13643,12 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" }, "string-width": { "version": "4.2.2", @@ -13938,9 +13910,9 @@ }, "dependencies": { "ajv": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.1.tgz", - "integrity": "sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14268,8 +14240,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", - "dev": true + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" }, "token-stream": { "version": "1.0.0", @@ -14286,12 +14257,6 @@ "punycode": "^2.1.1" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -14330,6 +14295,11 @@ "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", "dev": true }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -14368,7 +14338,6 @@ "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" @@ -14718,6 +14687,14 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -14766,8 +14743,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { "version": "1.0.4", @@ -14808,9 +14784,9 @@ "integrity": "sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ==" }, "vue-loader": { - "version": "15.9.7", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz", - "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==", + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", "dev": true, "requires": { "@vue/component-compiler-utils": "^3.1.0", @@ -14881,9 +14857,9 @@ } }, "webpack": { - "version": "5.45.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.45.1.tgz", - "integrity": "sha512-68VT2ZgG9EHs6h6UxfV2SEYewA9BA3SOLSnC2NEbJJiEwbAiueDL033R1xX0jzjmXvMh0oSeKnKgbO2bDXIEyQ==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.49.0.tgz", + "integrity": "sha512-XarsANVf28A7Q3KPxSnX80EkCcuOer5hTOEJWJNvbskOZ+EK3pobHarGHceyUZMxpsTHBHhlV7hiQyLZzGosYw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -14892,6 +14868,7 @@ "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.8.0", @@ -14908,13 +14885,13 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.2.0", - "webpack-sources": "^2.3.0" + "webpack-sources": "^3.2.0" }, "dependencies": { "@types/json-schema": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", - "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "acorn": { @@ -14942,52 +14919,36 @@ "dev": true }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "dev": true }, "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, "requires": { - "mime-db": "1.48.0" + "mime-db": "1.49.0" } }, "schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.7", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", - "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - } } } }, @@ -15629,22 +15590,10 @@ } }, "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", + "dev": true }, "websocket-driver": { "version": "0.7.4", @@ -15912,6 +15861,11 @@ "fd-slicer": "~1.1.0" } }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 35410f6e..17e5fb52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.11.0", + "version": "1.12.0", "description": "一个免费的音乐查找助手", "main": "./dist/electron/main.js", "productName": "lx-music-desktop", @@ -163,33 +163,32 @@ }, "homepage": "https://github.com/lyswhut/lx-music-desktop#readme", "devDependencies": { - "@babel/core": "^7.14.6", + "@babel/core": "^7.15.0", "@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-runtime": "^7.14.5", + "@babel/plugin-transform-runtime": "^7.15.0", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.14.7", + "@babel/preset-env": "^7.15.0", "babel-eslint": "^10.1.0", "babel-loader": "^8.2.2", - "babel-minify-webpack-plugin": "^0.3.1", "babel-preset-minify": "^0.5.1", - "browserslist": "^4.16.6", + "browserslist": "^4.16.7", "cfonts": "^2.9.3", - "chalk": "^4.1.1", + "chalk": "^4.1.2", "changelog-parser": "^2.8.0", "copy-webpack-plugin": "^9.0.1", - "core-js": "^3.15.2", + "core-js": "^3.16.0", "cross-env": "^7.0.3", - "css-loader": "^5.2.7", + "css-loader": "^6.2.0", "css-minimizer-webpack-plugin": "^3.0.2", "del": "^6.0.0", - "electron": "^13.1.7", + "electron": "^13.1.8", "electron-builder": "^22.11.7", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.3.779", - "eslint": "^7.30.0", + "electron-to-chromium": "^1.3.796", + "eslint": "^7.32.0", "eslint-config-standard": "^14.1.1", "eslint-formatter-friendly": "^7.0.0", "eslint-loader": "^4.0.2", @@ -204,9 +203,9 @@ "less": "^4.1.1", "less-loader": "^10.0.1", "less-plugin-clean-css": "^1.5.1", - "markdown-it": "^12.1.0", - "mini-css-extract-plugin": "^2.1.0", - "postcss": "^8.3.5", + "markdown-it": "^12.2.0", + "mini-css-extract-plugin": "^2.2.0", + "postcss": "^8.3.6", "postcss-loader": "^6.1.1", "postcss-pxtorem": "^6.0.0", "pug": "^3.0.2", @@ -219,25 +218,32 @@ "stylus-loader": "^6.1.0", "terser-webpack-plugin": "^5.1.4", "url-loader": "^4.1.1", - "vue-loader": "^15.9.7", + "vue-loader": "^15.9.8", "vue-template-compiler": "^2.6.14", - "webpack": "^5.45.1", + "webpack": "^5.49.0", "webpack-cli": "^4.7.2", "webpack-dev-server": "^3.11.2", "webpack-hot-middleware": "^2.25.0", "webpack-merge": "^5.8.0" }, "dependencies": { - "crypto-js": "^4.0.0", - "electron-log": "^4.3.5", + "crypto-js": "^4.1.1", + "electron-log": "^4.4.1", + "bufferutil": "^4.0.3", + "eiows": "^3.6.1", "electron-store": "^8.0.0", "electron-updater": "^4.3.9", + "http-terminator": "^3.0.0", "iconv-lite": "^0.6.3", "image-size": "^1.0.0", - "lrc-file-parser": "^1.1.0", + "koa": "^2.13.1", + "long": "^4.0.0", + "lrc-file-parser": "^1.1.2", "needle": "^2.8.0", "node-id3": "^0.2.3", "request": "^2.88.2", + "socket.io": "^4.1.3", + "utf-8-validate": "^5.0.5", "vue": "^2.6.14", "vue-i18n": "^8.25.0", "vue-router": "^3.5.2", diff --git a/publish/changeLog.md b/publish/changeLog.md index 3efcad29..e305bab2 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,26 +1,12 @@ ### 新增 -- 添加 win arm64 架构的安装包构建 -- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部” +- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看"常见问题"。 ### 优化 -- 优化网络请求,尝试去解决无法连接服务器的问题 -- 优化mg源打开歌单的链接兼容 +- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了 ### 修复 -- 修复mg源搜索失效的问题 - -### 移除 - -- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮 - -### 变更 - -- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。 -若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。 - -### 其他 - -- 更新electron到v13.1.7 +- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌 +- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题 diff --git a/publish/version.json b/publish/version.json index 50b3d364..cf50980b 100644 --- a/publish/version.json +++ b/publish/version.json @@ -1 +1 @@ -{"version":"1.11.0","desc":"新增\n- 添加 win arm64 架构的安装包构建\n- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”\n\n优化\n- 优化网络请求,尝试去解决无法连接服务器的问题\n- 优化mg源打开歌单的链接兼容\n\n修复\n- 修复mg源搜索失效的问题\n\n移除\n- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮\n\n变更\n- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。\n若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。\n\n其他\n- 更新electron到v13.1.7","history":[{"version":"1.10.2","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题"},{"version":"1.10.1","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题\n- 修复播放在空的歌单列表点击播放全部时报错的问题"},{"version":"1.10.0","desc":"lx music移动端已经发布了,使用习惯仍跟桌面版一样,不过功能、界面仍比较简单,有兴趣的可以去体检一下,项目地址:\nhttps://github.com/lyswhut/lx-music-mobile#readme\n\n新增\n- 排行榜界面添加播放、收藏整个排行榜功能,可以右击排行榜名字后,在弹出的右键菜单中使用。注:收藏、播放存在分页的排行榜时需等待操作完成后才能切换排行榜,不然会导致操作中断。\n- 新增Mac arm64位dmg包的构建\n\n修复\n- 修复全局快捷键对桌面歌词无效的问题\n- 修复快捷键设置框内的提示问题\n- 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题\n- 修复kw部分歌单无法打开的问题\n- 修复wy源的歌曲音质匹配问题\n- 修复mg源歌单标签、排行榜歌曲列表无法加载的问题\n- 修复了一个歌曲下载失败时不会跳过任务的问题\n\n其他\n- 更新 Electron 到 12.0.8"},{"version":"1.9.0","desc":"新增\n- 新增启动参数`-dhmkh`,此参数将禁用Chromium的Hardware Media Key Handling特性,用于解决漫步者部分型号耳机与本程序冲突导致耳机意外关机的问题\n- 新增Windows arm64位免安装版的构建\n- 新增黑色皮肤“黑灯瞎火”,有关于皮肤配色的建议欢迎反馈\n- 新增自动换源下载功能,默认关闭,当无法从歌曲的原始源下载时,将尝试切换到其他源下载,注:此功能不100%保证换源后的歌曲版本与原版一致\n\n优化\n- 程序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据,若出现数据读取错误的弹窗并出现我的列表丢失时可到GitHub或加群反馈\n- 当设置-代理启用,但主机地址为空的时,将不再使用代理配置进行网络连接,并且在离开设置界面时自动禁用代理\n- 优化歌曲自动换源匹配\n- 分离歌词与歌曲列表信息的保存,以减小列表列表文件损坏的几率\n- 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示\n\n修复\n- 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题\n- 修正设置页“搜索设置”部分内容的缩进显示问题\n- 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题"},{"version":"1.8.2","desc":"### 修复\r\n\r\n- 修复歌曲ID存储变更导致酷狗图片获取失败的问题\n- 修复收藏的在线列表id迁移保存出错的问题"},{"version":"1.8.1","desc":"修复\n- 修复歌词翻译的主题颜色适配问题"},{"version":"1.8.0","desc":"新增\n- 新增设置-其他-列表缓存信息清理功能,注:此功能一般情况下不要使用\n- 新增启动参数`-play`,可以在启动软件时播放指定歌单,使用方法看Readme.md的\"启动参数\"部分\n- 新增逐字歌词播放,默认开启,可到设置界面关闭,注:本功能目前仅对酷狗源的歌曲有效\n- 新增自定义源功能,源编写规则可以去常见问题查看\n\n优化\n- 允许播放除了搜索列表以外的所有歌曲,即原来没有播放按钮或者灰色的歌曲都可以去尝试点击播放。注:该功能的原理是尝试自动切换到其他源播放,所以不一定会播放成功,特别是对于那些独家的资源\n- 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示;现在在收藏单首歌曲时,若列表存在本歌曲则列表名字将变成灰色不可点击状态。总的来说,在添加单首歌曲时若列表名是灰色,则证明当前歌曲已在那个列表中\n- 将歌词翻译放到原文的下方,同时新增当前播放翻译的高亮功能\n\n移除\n- 移除虾米源。注:虽然已移除该源,但仍可尝试去播放之前添加的歌曲,虽然不一定会成功\n\n修复\n- 修复音乐搜索列表的稍后播放功能无效的问题\n- 修复搜索列表双击不支持播放的源时会导致切歌的问题\n- 修复歌单列表加载失败时无法进入歌单打开界面的问题\n- 修复mg源歌单列表无法加载的问题\n- 修复kg跳转到官方歌曲详情页的歌曲无法播放的问题\n- 修复我的列表的歌曲添加到其他列表时不排除当前列表的问题\n- 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题\n\n变更\n- 歌词翻译显示功能修改为默认关闭,注:此变更仅影响首次安装软件的用户\n\n其他\n- 更新electron到v9.4.4"},{"version":"1.7.1","desc":"修复\n- 修复非透明模式下右侧滚动条无法拖动的问题\n- 修复MAC下xm音乐滑块验证问题"},{"version":"1.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"1.6.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.6.0","desc":"

新增

\n\n

变更

\n\n

修复

\n\n"},{"version":"1.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.4.1","desc":"

修复

\n\n"},{"version":"1.4.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.3.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.2.2","desc":"

修复

\n\n"},{"version":"1.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.2.0","desc":"

提前祝大家中秋&国庆快乐~

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"1.1.1","desc":"

修复

\n\n"},{"version":"1.1.0","desc":"

新增

\n\n

修复

\n\n

优化

\n\n

移除

\n\n

其他

\n\n"},{"version":"1.0.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.0.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

更变

\n\n

其他

\n\n"},{"version":"0.18.2","desc":"

修复

\n\n"},{"version":"0.18.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.18.0","desc":"

新增

\n\n

优化

\n\n

更变

\n\n

修复

\n\n

移除

\n\n

其他

\n

更新 Electron 到 8.2.5

\n"},{"version":"0.17.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.16.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.15.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.1","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.13.1","desc":"

修复

\n\n

其他

\n\n"},{"version":"0.13.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n

其他

\n\n"},{"version":"0.12.1","desc":"

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.12.0","desc":"

由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!

\n

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.11.0","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.10.0","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.9.1","desc":"

修复

\n\n"},{"version":"0.9.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.8.2","desc":"

修复

\n\n"},{"version":"0.8.1","desc":"

修复

\n\n"},{"version":"0.8.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.6.2","desc":"

祝贺祖国成立70周年~!

\n

新增

\n\n

修复

\n\n"},{"version":"0.6.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.6.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.5.5","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.4","desc":"

移除

\n\n"},{"version":"0.5.3","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.5.2","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.5.1","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.4.0","desc":"

新增

\n\n

移除

\n\n"},{"version":"0.3.5","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.3.4","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.3.3","desc":"

修复

\n\n"},{"version":"0.3.2","desc":"

新增

\n\n"},{"version":"0.3.1","desc":"

修复

\n\n"},{"version":"0.3.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.2.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.2.2","desc":"

修复

\n\n"},{"version":"0.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.2.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.1.6","desc":"

修复

\n\n"},{"version":"0.1.5","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.4","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.1.2","desc":"

修复

\n\n"},{"version":"0.1.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} +{"version":"1.12.0","desc":"新增\n- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看\"常见问题\"。\n\n优化\n- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了\n\n修复\n- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌\n- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题","history":[{"version":"1.11.0","desc":"新增\n- 添加 win arm64 架构的安装包构建\n- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”\n\n优化\n- 优化网络请求,尝试去解决无法连接服务器的问题\n- 优化mg源打开歌单的链接兼容\n\n修复\n- 修复mg源搜索失效的问题\n\n移除\n- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮\n\n变更\n- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。\n若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。\n\n其他\n- 更新electron到v13.1.7"},{"version":"1.10.2","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题"},{"version":"1.10.1","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题\n- 修复播放在空的歌单列表点击播放全部时报错的问题"},{"version":"1.10.0","desc":"lx music移动端已经发布了,使用习惯仍跟桌面版一样,不过功能、界面仍比较简单,有兴趣的可以去体检一下,项目地址:\nhttps://github.com/lyswhut/lx-music-mobile#readme\n\n新增\n- 排行榜界面添加播放、收藏整个排行榜功能,可以右击排行榜名字后,在弹出的右键菜单中使用。注:收藏、播放存在分页的排行榜时需等待操作完成后才能切换排行榜,不然会导致操作中断。\n- 新增Mac arm64位dmg包的构建\n\n修复\n- 修复全局快捷键对桌面歌词无效的问题\n- 修复快捷键设置框内的提示问题\n- 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题\n- 修复kw部分歌单无法打开的问题\n- 修复wy源的歌曲音质匹配问题\n- 修复mg源歌单标签、排行榜歌曲列表无法加载的问题\n- 修复了一个歌曲下载失败时不会跳过任务的问题\n\n其他\n- 更新 Electron 到 12.0.8"},{"version":"1.9.0","desc":"新增\n- 新增启动参数`-dhmkh`,此参数将禁用Chromium的Hardware Media Key Handling特性,用于解决漫步者部分型号耳机与本程序冲突导致耳机意外关机的问题\n- 新增Windows arm64位免安装版的构建\n- 新增黑色皮肤“黑灯瞎火”,有关于皮肤配色的建议欢迎反馈\n- 新增自动换源下载功能,默认关闭,当无法从歌曲的原始源下载时,将尝试切换到其他源下载,注:此功能不100%保证换源后的歌曲版本与原版一致\n\n优化\n- 程序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据,若出现数据读取错误的弹窗并出现我的列表丢失时可到GitHub或加群反馈\n- 当设置-代理启用,但主机地址为空的时,将不再使用代理配置进行网络连接,并且在离开设置界面时自动禁用代理\n- 优化歌曲自动换源匹配\n- 分离歌词与歌曲列表信息的保存,以减小列表列表文件损坏的几率\n- 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示\n\n修复\n- 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题\n- 修正设置页“搜索设置”部分内容的缩进显示问题\n- 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题"},{"version":"1.8.2","desc":"### 修复\r\n\r\n- 修复歌曲ID存储变更导致酷狗图片获取失败的问题\n- 修复收藏的在线列表id迁移保存出错的问题"},{"version":"1.8.1","desc":"修复\n- 修复歌词翻译的主题颜色适配问题"},{"version":"1.8.0","desc":"新增\n- 新增设置-其他-列表缓存信息清理功能,注:此功能一般情况下不要使用\n- 新增启动参数`-play`,可以在启动软件时播放指定歌单,使用方法看Readme.md的\"启动参数\"部分\n- 新增逐字歌词播放,默认开启,可到设置界面关闭,注:本功能目前仅对酷狗源的歌曲有效\n- 新增自定义源功能,源编写规则可以去常见问题查看\n\n优化\n- 允许播放除了搜索列表以外的所有歌曲,即原来没有播放按钮或者灰色的歌曲都可以去尝试点击播放。注:该功能的原理是尝试自动切换到其他源播放,所以不一定会播放成功,特别是对于那些独家的资源\n- 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示;现在在收藏单首歌曲时,若列表存在本歌曲则列表名字将变成灰色不可点击状态。总的来说,在添加单首歌曲时若列表名是灰色,则证明当前歌曲已在那个列表中\n- 将歌词翻译放到原文的下方,同时新增当前播放翻译的高亮功能\n\n移除\n- 移除虾米源。注:虽然已移除该源,但仍可尝试去播放之前添加的歌曲,虽然不一定会成功\n\n修复\n- 修复音乐搜索列表的稍后播放功能无效的问题\n- 修复搜索列表双击不支持播放的源时会导致切歌的问题\n- 修复歌单列表加载失败时无法进入歌单打开界面的问题\n- 修复mg源歌单列表无法加载的问题\n- 修复kg跳转到官方歌曲详情页的歌曲无法播放的问题\n- 修复我的列表的歌曲添加到其他列表时不排除当前列表的问题\n- 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题\n\n变更\n- 歌词翻译显示功能修改为默认关闭,注:此变更仅影响首次安装软件的用户\n\n其他\n- 更新electron到v9.4.4"},{"version":"1.7.1","desc":"修复\n- 修复非透明模式下右侧滚动条无法拖动的问题\n- 修复MAC下xm音乐滑块验证问题"},{"version":"1.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"1.6.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.6.0","desc":"

新增

\n\n

变更

\n\n

修复

\n\n"},{"version":"1.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.4.1","desc":"

修复

\n\n"},{"version":"1.4.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.3.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.2.2","desc":"

修复

\n\n"},{"version":"1.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.2.0","desc":"

提前祝大家中秋&国庆快乐~

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"1.1.1","desc":"

修复

\n\n"},{"version":"1.1.0","desc":"

新增

\n\n

修复

\n\n

优化

\n\n

移除

\n\n

其他

\n\n"},{"version":"1.0.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.0.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

更变

\n\n

其他

\n\n"},{"version":"0.18.2","desc":"

修复

\n\n"},{"version":"0.18.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.18.0","desc":"

新增

\n\n

优化

\n\n

更变

\n\n

修复

\n\n

移除

\n\n

其他

\n

更新 Electron 到 8.2.5

\n"},{"version":"0.17.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.16.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.15.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.1","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.13.1","desc":"

修复

\n\n

其他

\n\n"},{"version":"0.13.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n

其他

\n\n"},{"version":"0.12.1","desc":"

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.12.0","desc":"

由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!

\n

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.11.0","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.10.0","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.9.1","desc":"

修复

\n\n"},{"version":"0.9.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.8.2","desc":"

修复

\n\n"},{"version":"0.8.1","desc":"

修复

\n\n"},{"version":"0.8.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.6.2","desc":"

祝贺祖国成立70周年~!

\n

新增

\n\n

修复

\n\n"},{"version":"0.6.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.6.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.5.5","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.4","desc":"

移除

\n\n"},{"version":"0.5.3","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.5.2","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.5.1","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.4.0","desc":"

新增

\n\n

移除

\n\n"},{"version":"0.3.5","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.3.4","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.3.3","desc":"

修复

\n\n"},{"version":"0.3.2","desc":"

新增

\n\n"},{"version":"0.3.1","desc":"

修复

\n\n"},{"version":"0.3.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.2.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.2.2","desc":"

修复

\n\n"},{"version":"0.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.2.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.1.6","desc":"

修复

\n\n"},{"version":"0.1.5","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.4","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.1.2","desc":"

修复

\n\n"},{"version":"0.1.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index 6a531679..fe0764cb 100644 --- a/src/common/defaultSetting.js +++ b/src/common/defaultSetting.js @@ -2,7 +2,7 @@ const path = require('path') const os = require('os') const defaultSetting = { - version: '1.0.42', + version: '1.0.43', player: { togglePlayMethod: 'listLoop', highQuality: false, @@ -85,6 +85,10 @@ const defaultSetting = { isToTray: false, themeId: 0, }, + sync: { + enable: false, + port: '23332', + }, windowSizeId: 2, themeId: 0, langId: null, diff --git a/src/common/ipcNames.js b/src/common/ipcNames.js index aa68e8d1..ad9bb243 100644 --- a/src/common/ipcNames.js +++ b/src/common/ipcNames.js @@ -66,6 +66,13 @@ const names = { get_music_url: 'get_music_url', save_music_url: 'save_music_url', clear_music_url: 'clear_music_url', + + sync_enable: 'sync_enable', + sync_status: 'sync_status', + sync_get_status: 'sync_get_status', + sync_generate_code: 'sync_generate_code', + sync_action_list: 'sync_action_list', + sync_list: 'sync_list', }, winLyric: { close: 'close', diff --git a/src/main/events/Common.js b/src/main/events/Common.js index bb9dea0d..e1ac61da 100644 --- a/src/main/events/Common.js +++ b/src/main/events/Common.js @@ -10,6 +10,10 @@ class Common extends EventEmitter { configStatus(name) { this.emit(COMMON_EVENT_NAME.configStatus, name) } + + saveMyList(data) { + this.emit(COMMON_EVENT_NAME.saveMyList, data) + } } module.exports = Common diff --git a/src/main/events/_name.js b/src/main/events/_name.js index d15a2c09..ea4c5154 100644 --- a/src/main/events/_name.js +++ b/src/main/events/_name.js @@ -1,6 +1,7 @@ exports.common = { initConfig: 'initConfig', configStatus: 'config', + saveMyList: 'saveMyList', } exports.mainWindow = { diff --git a/src/main/events/index.js b/src/main/events/index.js index 6899d1f0..9b543697 100644 --- a/src/main/events/index.js +++ b/src/main/events/index.js @@ -7,6 +7,7 @@ const WinLyric = require('./WinLyric') const HotKey = require('./HotKey') const { Event: UserApi } = require('../modules/userApi') +const { Event: Sync } = require('../modules/sync') if (!global.lx_event.common) global.lx_event.common = new Common() if (!global.lx_event.mainWindow) global.lx_event.mainWindow = new MainWindow() @@ -15,3 +16,4 @@ if (!global.lx_event.winLyric) global.lx_event.winLyric = new WinLyric() if (!global.lx_event.hotKey) global.lx_event.hotKey = new HotKey() if (!global.lx_event.userApi) global.lx_event.userApi = new UserApi() +if (!global.lx_event.sync) global.lx_event.sync = new Sync() diff --git a/src/main/modules/sync/event/event.js b/src/main/modules/sync/event/event.js new file mode 100644 index 00000000..ade680a9 --- /dev/null +++ b/src/main/modules/sync/event/event.js @@ -0,0 +1,23 @@ +const { EventEmitter } = require('events') +const SYNC_EVENT_NAME = require('./name') + +class Sync extends EventEmitter { + status(status) { + this.emit(SYNC_EVENT_NAME.status, status) + } + + sync_list(data) { + this.emit(SYNC_EVENT_NAME.sync_list, data) + } + + sync_handle_list(data) { + this.emit(SYNC_EVENT_NAME.sync_handle_list, data) + } + + action_list(data) { + this.emit(SYNC_EVENT_NAME.sync_action_list, data) + } +} + +module.exports = Sync + diff --git a/src/main/modules/sync/event/name.js b/src/main/modules/sync/event/name.js new file mode 100644 index 00000000..30abdf51 --- /dev/null +++ b/src/main/modules/sync/event/name.js @@ -0,0 +1,6 @@ +module.exports = { + sync_action_list: 'sync_action_list', + sync_list: 'sync_list', + sync_handle_list: 'sync_handle_list', + status: 'status', +} diff --git a/src/main/modules/sync/index.js b/src/main/modules/sync/index.js new file mode 100644 index 00000000..c1237a44 --- /dev/null +++ b/src/main/modules/sync/index.js @@ -0,0 +1,15 @@ +const Event = require('./event/event') +const eventNames = require('./event/name') +const modules = require('./modules') +const { startServer, stopServer, getStatus, generateCode } = require('./server/server') + + +module.exports = { + startServer, + stopServer, + getStatus, + generateCode, + Event, + eventNames, + modules, +} diff --git a/src/main/modules/sync/modules/index.js b/src/main/modules/sync/modules/index.js new file mode 100644 index 00000000..8e783c9a --- /dev/null +++ b/src/main/modules/sync/modules/index.js @@ -0,0 +1 @@ +exports.list = require('./list') diff --git a/src/main/modules/sync/modules/list.js b/src/main/modules/sync/modules/list.js new file mode 100644 index 00000000..41574768 --- /dev/null +++ b/src/main/modules/sync/modules/list.js @@ -0,0 +1,41 @@ +const { encryptMsg, decryptMsg } = require('../server/utils') +let io + +const handleListAction = ({ action, data }) => { + // console.log(action, data) + global.lx_event.sync.action_list({ action, data }) +} + +// const addMusic = (orderId, callback) => { +// // ... +// } + +const broadcast = async(action, data, excludeIds = []) => { + if (!io) return + const sockets = await io.fetchSockets() + for (const socket of sockets) { + if (excludeIds.includes(socket.data.keyInfo.clientId)) continue + socket.emit(action, encryptMsg(socket.data.keyInfo, data)) + } +} + +exports.sendListAction = (action, data) => { + // io.sockets + return broadcast('list:action', JSON.stringify({ action, data })) +} + +exports.registerListHandler = (_io, socket) => { + io = _io + socket.on('list:action', msg => { + // console.log(msg) + msg = decryptMsg(socket.data.keyInfo, msg) + if (!msg) return + handleListAction(JSON.parse(msg)) + broadcast('list:action', msg, [socket.data.keyInfo.clientId]) + // socket.broadcast.emit('list:action', { action: 'list_remove', data: { id: 'default', index: 0 } }) + }) + // socket.on('list:add', addMusic) +} +exports.unregisterListHandler = () => { + io = null +} diff --git a/src/main/modules/sync/server/auth.js b/src/main/modules/sync/server/auth.js new file mode 100644 index 00000000..df1d3bf5 --- /dev/null +++ b/src/main/modules/sync/server/auth.js @@ -0,0 +1,69 @@ +const { aesEncrypt, aesDecrypt, createClientKeyInfo, getClientKeyInfo, setClientKeyInfo } = require('./utils') + +const authMsg = 'lx-music auth::' +const helloMsg = 'Hello~::^-^::' + +exports.authCode = async(req, res, authCode) => { + let code = 401 + let msg = 'Forbidden' + // console.log(req.headers) + if (req.headers.m) { + label: + if (req.headers.i) { + const keyInfo = getClientKeyInfo(req.headers.i) + if (!keyInfo) break label + let text + try { + text = aesDecrypt(req.headers.m, keyInfo.key, keyInfo.iv) + } catch (err) { + break label + } + console.log(text) + if (text.startsWith(authMsg)) { + code = 200 + const deviceName = text.replace(authMsg, '') || 'Unknown' + if (deviceName != keyInfo.deviceName) { + keyInfo.deviceName = deviceName + setClientKeyInfo(keyInfo) + } + msg = aesEncrypt(helloMsg, keyInfo.key, keyInfo.iv) + } + } else { + let key = ''.padStart(16, Buffer.from(authCode).toString('hex')) + const iv = Buffer.from(key.split('').reverse().join('')).toString('base64') + key = Buffer.from(key).toString('base64') + // console.log(authCode, key, iv) + let text + try { + text = aesDecrypt(req.headers.m, key, iv) + } catch (err) { + break label + } + console.log(text) + if (text.startsWith(authMsg)) { + code = 200 + const deviceName = text.replace(authMsg, '') || 'Unknown' + msg = aesEncrypt(JSON.stringify(createClientKeyInfo(deviceName)), key, iv) + } + } + } + res.writeHead(code) + res.end(msg) +} + +exports.authConnect = async req => { + const { i, t } = req._query + label: + if (i && t) { + const keyInfo = getClientKeyInfo(i) + if (!keyInfo) break label + let text + try { + text = aesDecrypt(t, keyInfo.key, keyInfo.iv) + } catch (err) { + break label + } + if (text == 'lx-music connect') return + } + throw new Error('failed') +} diff --git a/src/main/modules/sync/server/index.js b/src/main/modules/sync/server/index.js new file mode 100644 index 00000000..dbfb83f1 --- /dev/null +++ b/src/main/modules/sync/server/index.js @@ -0,0 +1,7 @@ +const { startServer, stopServer, getStatus } = require('./server') + +module.exports = { + startServer, + stopServer, + getStatus, +} diff --git a/src/main/modules/sync/server/server.js b/src/main/modules/sync/server/server.js new file mode 100644 index 00000000..bcb521ee --- /dev/null +++ b/src/main/modules/sync/server/server.js @@ -0,0 +1,165 @@ +const http = require('http') +const sio = require('socket.io') +const { createHttpTerminator } = require('http-terminator') +const modules = require('../modules') +const { authCode, authConnect } = require('./auth') +const { getAddress, getServerId, generateCode, getClientKeyInfo } = require('./utils') +const syncList = require('./syncList') + + +let status = { + status: false, + message: '', + address: [], + code: '', + devices: [], +} + +const handleConnection = (io, socket) => { + console.log('connection') + // console.log(socket.handshake.query) + for (const module of Object.values(modules)) { + module.registerListHandler(io, socket) + } +} + +const authConnection = (req, callback) => { + // console.log(req.headers) + // // console.log(req.auth) + // console.log(req._query.authCode) + authConnect(req).then(() => { + callback(null, true) + }).catch(err => { + callback(err, false) + }) +} + +let httpTerminator = null +let io = null + +const handleStartServer = (port = 9527) => new Promise((resolve, reject) => { + const httpServer = http.createServer((req, res) => { + // console.log(req.url) + let code + let msg + switch (req.url) { + case '/hello': + code = 200 + msg = 'Hello~::^-^::' + break + case '/id': + code = 200 + msg = 'OjppZDo6' + getServerId() + break + case '/ah': + authCode(req, res, status.code) + break + default: + code = 401 + msg = 'Forbidden' + break + } + if (!code) return + res.writeHead(code) + res.end(msg) + }) + httpTerminator = createHttpTerminator({ + server: httpServer, + }) + io = sio(httpServer, { + path: '/sync', + serveClient: false, + connectTimeout: 10000, + pingTimeout: 30000, + maxHttpBufferSize: 3e6, + allowRequest: authConnection, + transports: ['websocket'], + }) + + io.on('connection', async socket => { + socket.on('disconnect', reason => { + console.log('disconnect', reason) + status.devices.splice(status.devices.findIndex(k => k.clientId == keyInfo.clientId), 1) + global.lx_event.sync.status(status) + }) + const keyInfo = getClientKeyInfo(socket.handshake.query.i) + // socket.lx_keyInfo = keyInfo + socket.data.keyInfo = keyInfo + try { + await syncList(io, socket) + } catch (err) { + console.log(err) + return + } + status.devices.push(keyInfo) + handleConnection(io, socket, keyInfo) + global.lx_event.sync.status(status) + }) + + httpServer.on('error', error => { + console.log(error) + reject(error) + }) + + httpServer.on('listening', () => { + const addr = httpServer.address() + const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port + console.info(`Listening on ${bind}`) + resolve() + }) + + httpServer.listen(port) +}) + +const handleStopServer = async() => { + if (!httpTerminator) return + await io.close() + await httpTerminator.terminate().catch(() => {}) + io = null + httpTerminator = null +} + +exports.stopServer = async() => { + if (!status.status) return + console.log('stoping sync server...') + return handleStopServer().then(() => { + console.log('sync server stoped') + status.status = false + status.message = '' + status.address = [] + status.code = '' + }).catch(err => { + console.log(err) + status.message = err.message + }).finally(() => { + global.lx_event.sync.status(status) + }) +} +exports.startServer = async port => { + if (status.status) await handleStopServer() + + console.log('starting sync server...') + return handleStartServer(port).then(() => { + console.log('sync server started') + status.status = true + status.message = '' + status.address = getAddress() + status.code = generateCode() + }).catch(err => { + console.log(err) + status.status = false + status.message = err.message + status.address = [] + status.code = '' + }).finally(() => { + global.lx_event.sync.status(status) + }) +} + +exports.getStatus = () => status + +exports.generateCode = async() => { + status.code = generateCode() + global.lx_event.sync.status(status) + return status.code +} diff --git a/src/main/modules/sync/server/syncList.js b/src/main/modules/sync/server/syncList.js new file mode 100644 index 00000000..5897e385 --- /dev/null +++ b/src/main/modules/sync/server/syncList.js @@ -0,0 +1,394 @@ +const path = require('path') +const fs = require('fs') +const fsPromises = fs.promises +const { app } = require('electron') +const { encryptMsg, decryptMsg } = require('./utils') +const SYNC_EVENT_NAMES = require('../event/name') +const { common: COMMON_EVENT_NAME } = require('@main/events/_name') +const { throttle } = require('@common/utils') + +let io +let syncingId = null +const wait = (time = 1000) => new Promise((resolve, reject) => setTimeout(resolve, time)) + +const getRemoteListData = socket => new Promise((resolve, reject) => { + console.log('getRemoteListData') + const handleError = reason => { + reject(new Error(reason)) + } + const handleSuccess = enData => { + socket.removeListener('disconnect', handleError) + socket.removeListener('list:sync', handleSuccess) + console.log('getRemoteListData', 'handleSuccess') + const data = JSON.parse(decryptMsg(socket.data.keyInfo, enData)) + if (!data) return reject(new Error('Get remote list data failed')) + if (data.action != 'getData') return + resolve(data.data) + } + + socket.on('disconnect', handleError) + socket.on('list:sync', handleSuccess) + socket.emit('list:sync', encryptMsg(socket.data.keyInfo, JSON.stringify({ action: 'getData', data: 'all' }))) +}) + +const getLocalListData = () => new Promise((resolve, reject) => { + const handleSuccess = ({ action, data }) => { + if (action !== 'getData') return + global.lx_event.sync.off(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess) + resolve(data) + } + global.lx_event.sync.on(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess) + global.lx_event.sync.sync_list({ + action: 'getData', + }) +}) +const getSyncMode = keyInfo => new Promise((resolve, reject) => { + const handleSuccess = ({ action, data }) => { + if (action !== 'selectMode') return + global.lx_event.sync.off(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess) + resolve(data) + } + global.lx_event.sync.on(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess) + global.lx_event.sync.sync_list({ + action: 'selectMode', + data: keyInfo, + }) +}) + +const finishedSync = socket => { + return socket.emit('list:sync', encryptMsg(socket.data.keyInfo, JSON.stringify({ + action: 'finished', + }))) +} + +const setLocalList = listData => { + global.lx_event.sync.sync_list({ + action: 'setData', + data: listData, + }) +} +const setRemotelList = async(socket, listData) => { + if (!io) return + const sockets = await io.fetchSockets() + for (const socket of sockets) { + // if (excludeIds.includes(socket.data.keyInfo.clientId)) continue + socket.emit('list:sync', encryptMsg(socket.data.keyInfo, JSON.stringify({ action: 'setData', data: listData }))) + } +} + +let writeFilePromises = {} +const updateSnapshot = (path, data) => { + console.log('updateSnapshot', path) + let writeFilePromise = writeFilePromises[path] || Promise.resolve() + return writeFilePromise.then(() => { + writeFilePromise = writeFilePromises[path] = fsPromises.writeFile(path, data) + return writeFilePromise + }) +} + + +const createListDataObj = listData => { + const listDataObj = {} + for (const list of listData.userList) listDataObj[list.id] = list + return listDataObj +} + +const handleMergeList = (sourceList, targetList, addMusicLocationType) => { + let newList + switch (addMusicLocationType) { + case 'top': + newList = [...targetList.list, ...sourceList.list] + break + case 'bottom': + default: + newList = [...sourceList.list, ...targetList.list] + break + } + const map = {} + const ids = [] + switch (addMusicLocationType) { + case 'top': + newList = [...targetList.list, ...sourceList.list] + for (let i = newList.length - 1; i > -1; i--) { + const item = newList[i] + if (map[item.songmid]) continue + ids.unshift(item.songmid) + map[item.songmid] = item + } + break + case 'bottom': + default: + newList = [...sourceList.list, ...targetList.list] + for (const item of newList) { + if (map[item.songmid]) continue + ids.push(item.songmid) + map[item.songmid] = item + } + break + } + return { + ...sourceList, + list: ids.map(id => map[id]), + } +} +const mergeList = (sourceListData, targetListData) => { + const addMusicLocationType = global.appSetting.list.addMusicLocationType + const newListData = {} + newListData.defaultList = handleMergeList(sourceListData.defaultList, targetListData.defaultList, addMusicLocationType) + newListData.loveList = handleMergeList(sourceListData.loveList, targetListData.loveList, addMusicLocationType) + + const listDataObj = createListDataObj(sourceListData) + newListData.userList = [...sourceListData.userList] + + for (const list of targetListData.userList) { + const targetList = listDataObj[list.id] + if (targetList) { + targetList.list = handleMergeList(targetList, list, addMusicLocationType).list + } else { + newListData.userList.push(list) + } + } + + return newListData +} +const overwriteList = (sourceListData, targetListData) => { + const newListData = {} + newListData.defaultList = sourceListData.defaultList + newListData.loveList = sourceListData.loveList + + const listDataObj = createListDataObj(sourceListData) + newListData.userList = [...sourceListData.userList] + + for (const list of targetListData.userList) { + const targetList = listDataObj[list.id] + if (targetList) continue + newListData.userList.push(list) + } + + return newListData +} + +const handleMergeListData = async socket => { + let isSelectingMode = false + const handleDisconnect = () => { + if (!isSelectingMode) return + global.lx_event.sync.sync_list({ + action: 'closeSelectMode', + }) + } + socket.on('disconnect', handleDisconnect) + isSelectingMode = true + const mode = await getSyncMode(socket.data.keyInfo) + isSelectingMode = false + const [remoteListData, localListData] = await Promise.all([getRemoteListData(socket), getLocalListData()]) + console.log('handleMergeListData', 'remoteListData, localListData') + let listData + switch (mode) { + case 'merge_local_remote': + listData = mergeList(localListData, remoteListData) + break + case 'merge_remote_local': + listData = mergeList(remoteListData, localListData) + break + case 'overwrite_local_remote': + listData = overwriteList(localListData, remoteListData) + break + case 'overwrite_remote_local': + listData = overwriteList(remoteListData, localListData) + break + case 'overwrite_local_remote_full': + listData = localListData + break + case 'overwrite_remote_local_full': + listData = remoteListData + break + case 'none': return + case 'cancel': + socket.disconnect(true) + throw new Error('cancel') + } + return listData +} + +const handleSyncList = async socket => { + const [remoteListData, localListData] = await Promise.all([getRemoteListData(socket), getLocalListData()]) + console.log('handleSyncList', 'remoteListData, localListData') + const listData = {} + if (localListData.defaultList.list.length || localListData.loveList.list.length || localListData.userList.length) { + if (remoteListData.defaultList.list.length || remoteListData.loveList.list.length || remoteListData.userList.length) { + const mergedList = await handleMergeListData(socket) + console.log('handleMergeListData', 'mergedList') + console.log(mergedList) + if (!mergedList) return + listData.defaultList = mergedList.defaultList + listData.loveList = mergedList.loveList + listData.userList = mergedList.userList + setLocalList(mergedList) + setRemotelList(socket, mergedList) + } else { + setRemotelList(socket, localListData) + listData.defaultList = localListData.defaultList + listData.loveList = localListData.loveList + listData.userList = localListData.userList + } + } else { + if (remoteListData.defaultList.list.length || remoteListData.loveList.list.length || remoteListData.userList.length) { + setLocalList(remoteListData) + listData.defaultList = remoteListData.defaultList + listData.loveList = remoteListData.loveList + listData.userList = remoteListData.userList + } else { + listData.defaultList = localListData.defaultList + listData.loveList = localListData.loveList + listData.userList = localListData.userList + } + } + return updateSnapshot(socket.data.snapshotFilePath, JSON.stringify({ + defaultList: listData.defaultList, + loveList: listData.loveList, + userList: listData.userList, + })).then(() => { + socket.data.isCreatedSnapshot = true + return listData + }) +} + +const mergeListDataFromSnapshot = (sourceList, targetList, snapshotList, addMusicLocationType) => { + const removedListIds = new Set() + const sourceListItemIds = new Set() + const targetListItemIds = new Set() + for (const m of sourceList.list) sourceListItemIds.add(m.songmid) + for (const m of targetList.list) targetListItemIds.add(m.songmid) + for (const m of snapshotList.list) { + if (!sourceListItemIds.has(m.songmid)) removedListIds.add(m.songmid) + } + for (const m of snapshotList.list) { + if (!targetListItemIds.has(m.songmid)) removedListIds.add(m.songmid) + } + + let newList + const map = {} + const ids = [] + switch (addMusicLocationType) { + case 'top': + newList = [...targetList.list, ...sourceList.list] + for (let i = newList.length - 1; i > -1; i--) { + const item = newList[i] + if (map[item.songmid] || removedListIds.has(item.songmid)) continue + ids.unshift(item.songmid) + map[item.songmid] = item + } + break + case 'bottom': + default: + newList = [...sourceList.list, ...targetList.list] + for (const item of newList) { + if (map[item.songmid] || removedListIds.has(item.songmid)) continue + ids.push(item.songmid) + map[item.songmid] = item + } + break + } + return { + ...sourceList, + list: ids.map(id => map[id]), + } +} +const handleMergeListDataFromSnapshot = async(socket, snapshot) => { + const addMusicLocationType = global.appSetting.list.addMusicLocationType + const [remoteListData, localListData] = await Promise.all([getRemoteListData(socket), getLocalListData()]) + console.log('handleMergeListDataFromSnapshot', 'remoteListData, localListData') + const newListData = {} + newListData.defaultList = mergeListDataFromSnapshot(localListData.defaultList, remoteListData.defaultList, snapshot.defaultList, addMusicLocationType) + newListData.loveList = mergeListDataFromSnapshot(localListData.loveList, remoteListData.loveList, snapshot.loveList, addMusicLocationType) + const localUserListData = createListDataObj(localListData) + const remoteUserListData = createListDataObj(remoteListData) + const snapshotUserListData = createListDataObj(snapshot) + const removedListIds = new Set() + const localUserListIds = new Set() + const remoteUserListIds = new Set() + for (const l of localListData.userList) localUserListIds.add(l.id) + for (const l of remoteListData.userList) remoteUserListIds.add(l.id) + + for (const l of snapshot.userList) { + if (!localUserListIds.has(l.id)) removedListIds.add(l.id) + } + for (const l of snapshot.userList) { + if (!remoteUserListIds.has(l.id)) removedListIds.add(l.id) + } + + let newUserList = [] + for (const list of localListData.userList) { + if (removedListIds.has(list.id)) continue + const remoteList = remoteUserListData[list.id] + let newList + if (remoteList) { + newList = mergeListDataFromSnapshot(list, remoteList, snapshotUserListData[list.id], addMusicLocationType) + } else { + newList = { ...list } + } + newUserList.push(newList) + } + for (const list of remoteListData.userList) { + if (removedListIds.has(list.id) || localUserListData[list.id]) continue + newUserList.push({ ...list }) + } + newListData.userList = newUserList + setLocalList(newListData) + setRemotelList(socket, newListData) + return updateSnapshot(socket.data.snapshotFilePath, JSON.stringify({ + defaultList: newListData.defaultList, + loveList: newListData.loveList, + userList: newListData.userList, + })).then(() => { + socket.data.isCreatedSnapshot = true + return newListData + }) +} + +const registerUpdateSnapshotTask = (socket, snapshot) => { + if (!socket.data.isCreatedSnapshot) return + const handleUpdateSnapshot = throttle(({ defaultList, loveList, userList }) => { + if (defaultList != null) snapshot.defaultList = defaultList + if (loveList != null) snapshot.loveList = loveList + if (userList != null) snapshot.userList = userList + updateSnapshot(socket.data.snapshotFilePath, JSON.stringify(snapshot)) + }, 10000) + global.lx_event.common.on(COMMON_EVENT_NAME.saveMyList, handleUpdateSnapshot) + socket.on('disconnect', () => { + global.lx_event.common.off(COMMON_EVENT_NAME.saveMyList, handleUpdateSnapshot) + }) +} + +const syncList = async socket => { + socket.data.snapshotFilePath = path.join(app.getPath('userData'), `snapshot-${Buffer.from(socket.data.keyInfo.clientId).toString('hex').substring(0, 10)}.json`) + let fileData + let isSyncRequired = false + try { + fileData = await fsPromises.readFile(socket.data.snapshotFilePath) + fileData = JSON.parse(fileData) + } catch (err) { + if (err.code !== 'ENOENT') throw err + isSyncRequired = true + } + console.log('isSyncRequired', isSyncRequired) + if (isSyncRequired) return handleSyncList(socket) + return handleMergeListDataFromSnapshot(socket, fileData) +} + +const checkSyncQueue = async() => { + if (!syncingId) return + await wait() + return checkSyncQueue() +} +module.exports = async(_io, socket) => { + io = _io + await checkSyncQueue() + syncingId = socket.data.keyInfo.clientId + return syncList(socket).then(newListData => { + registerUpdateSnapshotTask(socket, { ...newListData }) + return finishedSync(socket) + }).finally(() => { + syncingId = null + }) +} diff --git a/src/main/modules/sync/server/utils.js b/src/main/modules/sync/server/utils.js new file mode 100644 index 00000000..e880fd83 --- /dev/null +++ b/src/main/modules/sync/server/utils.js @@ -0,0 +1,93 @@ +const { networkInterfaces } = require('os') +const { randomBytes, createCipheriv, createDecipheriv } = require('crypto') +const getStore = require('@common/store') +const STORE_NAME = 'sync' + +exports.getAddress = () => { + const nets = networkInterfaces() + const results = [] + // console.log(nets) + + for (const name of Object.keys(nets)) { + for (const net of nets[name]) { + // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses + if (net.family === 'IPv4' && !net.internal) { + results.push(net.address) + } + } + } + return results +} + +let serverId +exports.getServerId = () => { + if (serverId) return serverId + const store = getStore(STORE_NAME) + serverId = store.get('serverId') + if (!serverId) { + serverId = randomBytes(4 * 4).toString('base64') + store.set('serverId', serverId) + } + return serverId +} + +let keyInfos +exports.createClientKeyInfo = deviceName => { + const keyInfo = { + clientId: randomBytes(4 * 4).toString('base64'), + key: randomBytes(16).toString('base64'), + iv: randomBytes(16).toString('base64'), + deviceName, + } + const store = getStore(STORE_NAME) + if (!keyInfos) keyInfos = store.get('keys') || {} + if (Object.keys(keyInfos).length > 101) throw new Error('max keys') + + keyInfos[keyInfo.clientId] = keyInfo + store.set('keys', keyInfos) + return keyInfo +} +exports.setClientKeyInfo = keyInfo => { + keyInfos[keyInfo.clientId] = keyInfo + const store = getStore(STORE_NAME) + store.set('keys', keyInfos) +} +exports.getClientKeyInfo = clientId => { + if (!keyInfos) { + const store = getStore(STORE_NAME) + keyInfos = store.get('keys') || {} + } + return keyInfos[clientId] || null +} + +exports.generateCode = () => { + return Math.random().toString().substring(2, 8) +} + +exports.aesEncrypt = (buffer, key, iv) => { + const cipher = createCipheriv('aes-128-cbc', Buffer.from(key, 'base64'), Buffer.from(iv, 'base64')) + return Buffer.concat([cipher.update(buffer), cipher.final()]).toString('base64') +} + +exports.aesDecrypt = (text, key, iv) => { + const decipher = createDecipheriv('aes-128-cbc', Buffer.from(key, 'base64'), Buffer.from(iv, 'base64')) + return Buffer.concat([decipher.update(Buffer.from(text, 'base64')), decipher.final()]).toString() +} + +exports.encryptMsg = (keyInfo, msg) => { + return msg + // if (!keyInfo) return '' + // return exports.aesEncrypt(msg, keyInfo.key, keyInfo.iv) +} + +exports.decryptMsg = (keyInfo, enMsg) => { + return enMsg + // if (!keyInfo) return '' + // let msg = '' + // try { + // msg = exports.aesDecrypt(enMsg, keyInfo.key, keyInfo.iv) + // } catch (err) { + // console.log(err) + // } + // return msg +} diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js index 9fafd6df..1df53eeb 100644 --- a/src/main/rendererEvents/index.js +++ b/src/main/rendererEvents/index.js @@ -23,3 +23,4 @@ require('./musicUrl') require('./kw_decodeLyric') require('./userApi') +require('./sync') diff --git a/src/main/rendererEvents/playList.js b/src/main/rendererEvents/playList.js index 3eb0aed3..d73a7e29 100644 --- a/src/main/rendererEvents/playList.js +++ b/src/main/rendererEvents/playList.js @@ -24,6 +24,7 @@ mainOn(ipcMainWindowNames.save_playlist, (event, { type, data }) => { switch (type) { case 'myList': handleSaveList(data) + global.lx_event.common.saveMyList(data) break case 'downloadList': getStore('downloadList').set('list', data) diff --git a/src/main/rendererEvents/sync.js b/src/main/rendererEvents/sync.js new file mode 100644 index 00000000..55569f84 --- /dev/null +++ b/src/main/rendererEvents/sync.js @@ -0,0 +1,33 @@ +const { mainSend, NAMES: { mainWindow: ipcMainWindowNames }, mainOn, mainHandle } = require('@common/ipc') +const { eventNames, modules, startServer, stopServer, getStatus, generateCode } = require('../modules/sync') + + +mainOn(ipcMainWindowNames.sync_action_list, (event, { action, data }) => { + modules.list.sendListAction(action, data) +}) + +mainHandle(ipcMainWindowNames.sync_enable, (event, { enable, port }) => { + return enable ? startServer(port) : stopServer() +}) + +mainHandle(ipcMainWindowNames.sync_get_status, () => { + return getStatus() +}) + +mainHandle(ipcMainWindowNames.sync_generate_code, () => { + return generateCode() +}) + +mainOn(ipcMainWindowNames.sync_list, (event, { action, data }) => { + global.lx_event.sync.sync_handle_list({ action, data }) +}) + +global.lx_event.sync.on(eventNames.sync_action_list, ({ action, data }) => { + mainSend(global.modules.mainWindow, ipcMainWindowNames.sync_action_list, { action, data }) +}) +global.lx_event.sync.on(eventNames.status, status => { + mainSend(global.modules.mainWindow, ipcMainWindowNames.sync_status, status) +}) +global.lx_event.sync.on(eventNames.sync_list, ({ action, data }) => { + mainSend(global.modules.mainWindow, ipcMainWindowNames.sync_list, { action, data }) +}) diff --git a/src/main/utils/autoUpdate.js b/src/main/utils/autoUpdate.js index 4c562584..3051574a 100644 --- a/src/main/utils/autoUpdate.js +++ b/src/main/utils/autoUpdate.js @@ -1,4 +1,4 @@ -const { log } = require('../../common/utils') +const { log, isWin } = require('../../common/utils') const { autoUpdater } = require('electron-updater') const { mainOn, mainSend, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc') @@ -120,6 +120,11 @@ module.exports = () => { }, 1000) }) - autoUpdater.checkForUpdates() + // 由于集合安装包中不包含win arm版,这将会导致arm版更新失败 + if (isWin && process.arch.includes('arm')) { + handleSendEvent({ type: ipcMainWindowNames.update_error, info: 'failed' }) + } else { + autoUpdater.checkForUpdates() + } } diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 56626d6b..5e548f19 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -8,6 +8,7 @@ core-icons material-version-modal(v-show="version.showModal") material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact") + material-sync-mode-modal(v-show="globalObj.sync.isShowSyncMode") #container(v-else :class="theme") core-aside#left #right @@ -17,6 +18,7 @@ core-icons material-version-modal(v-show="version.showModal") material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact") + material-sync-mode-modal(v-show="globalObj.sync.isShowSyncMode") diff --git a/src/renderer/components/core/PlayerDetail.vue b/src/renderer/components/core/PlayerDetail.vue index 3ed3442b..7cd02a0c 100644 --- a/src/renderer/components/core/PlayerDetail.vue +++ b/src/renderer/components/core/PlayerDetail.vue @@ -282,7 +282,7 @@ export default { setProgress(event) { this.$emit('action', { type: 'progress', - data: event.offsetX / this.pregessWidth, + data: event, }) }, setProgressWidth() { diff --git a/src/renderer/components/material/Modal.vue b/src/renderer/components/material/Modal.vue index d9981428..6b6de777 100644 --- a/src/renderer/components/material/Modal.vue +++ b/src/renderer/components/material/Modal.vue @@ -140,7 +140,7 @@ export default { box-shadow: 0 0 3px rgba(0, 0, 0, .3); overflow: hidden; max-height: 80%; - max-width: 70%; + max-width: 76%; position: relative; display: flex; flex-flow: column nowrap; diff --git a/src/renderer/components/material/SyncModeModal.vue b/src/renderer/components/material/SyncModeModal.vue new file mode 100644 index 00000000..bded1cc3 --- /dev/null +++ b/src/renderer/components/material/SyncModeModal.vue @@ -0,0 +1,164 @@ + + + + + + diff --git a/src/renderer/event/index.js b/src/renderer/event/index.js index d818b955..29374416 100644 --- a/src/renderer/event/index.js +++ b/src/renderer/event/index.js @@ -1,7 +1,7 @@ import Vue from 'vue' import keyBind from '../utils/keyBind' import { rendererOn, rendererSend, NAMES, rendererInvoke } from '../../common/ipc' -import { base as baseName } from './names' +import { base as baseName, sync as syncName } from './names' import { common as hotKeyNamesCommon } from '../../common/hotKey' const eventHub = window.eventHub = new Vue() @@ -77,3 +77,18 @@ rendererOn(NAMES.mainWindow.set_hot_key_config, (event, config) => { } window.eventHub.$emit(baseName.set_hot_key_config, config) }) + +rendererOn(NAMES.mainWindow.sync_action_list, (event, { action, data }) => { + window.eventHub.$emit(syncName.handle_action_list, { action, data }) +}) +eventHub.$on(syncName.send_action_list, ({ action, data }) => { + if (!window.globalObj.sync.enable) return + rendererSend(NAMES.mainWindow.sync_action_list, { action, data }) +}) +rendererOn(NAMES.mainWindow.sync_list, (event, { action, data }) => { + window.eventHub.$emit(syncName.handle_sync_list, { action, data }) +}) +eventHub.$on(syncName.send_sync_list, ({ action, data }) => { + if (!window.globalObj.sync.enable) return + rendererSend(NAMES.mainWindow.sync_list, { action, data }) +}) diff --git a/src/renderer/event/names.js b/src/renderer/event/names.js index e8135907..7ce8c475 100644 --- a/src/renderer/event/names.js +++ b/src/renderer/event/names.js @@ -10,6 +10,12 @@ const names = { set_config: 'set_config', set_hot_key_config: 'set_hot_key_config', }, + sync: { + send_action_list: 'send_action_list', + handle_action_list: 'handle_action_list', + send_sync_list: 'send_sync_list', + handle_sync_list: 'handle_sync_list', + }, } for (const item of Object.keys(names)) { @@ -20,3 +26,4 @@ for (const item of Object.keys(names)) { } export const base = names.base +export const sync = names.sync diff --git a/src/renderer/lang/en-us/material/sync_mode_modal.json b/src/renderer/lang/en-us/material/sync_mode_modal.json new file mode 100644 index 00000000..77d3b00d --- /dev/null +++ b/src/renderer/lang/en-us/material/sync_mode_modal.json @@ -0,0 +1,19 @@ +{ + "merge_btn_local_remote": "Local list merge remote list", + "merge_btn_remote_local": "Remote list merge local list", + "merge_label": "Merge", + "merge_tip": "Merge:", + "merge_tip_desc": "Merge the two lists together, the same song will be removed (the song of the merged person is removed), and different songs will be added.", + "other_label": "Other", + "other_tip": "Other: ", + "other_tip_desc": "\"Only use real-time synchronization function\" will not modify the lists of both parties, only real-time synchronization operations; \"Cancel synchronization\" will directly disconnect the two parties.", + "overwrite": "Full coverage", + "overwrite_btn_cancel": "Cancel sync", + "overwrite_btn_local_remote": "Local list Overwrite remote list", + "overwrite_btn_none": "Only use real-time synchronization", + "overwrite_btn_remote_local": "Remote list Overwrite local list", + "overwrite_label": "Cover", + "overwrite_tip": "Cover: ", + "overwrite_tip_desc": "The list with the same ID of the covered person and the covered list will be deleted and replaced with the list of the covered person (lists with different list IDs will be merged together). If you check Complete coverage, all lists of the covered person will be moved. \nDivide, and then replace with a list of overriders.", + "title": "Choose how to synchronize the list with {name}" +} diff --git a/src/renderer/lang/en-us/view/setting.json b/src/renderer/lang/en-us/view/setting.json index 946cbeb3..1db3e36c 100644 --- a/src/renderer/lang/en-us/view/setting.json +++ b/src/renderer/lang/en-us/view/setting.json @@ -130,6 +130,14 @@ "search_focus_search_box": "Automatically focus the search box on startup", "search_history": "Search history", "search_hot": "Top Searches", + "sync": "Data synchronization [This is a test function, it is recommended to back up the playlist before using it for the first time]", + "sync_address": "Synchronization service address: {address}", + "sync_auth_code": "Connection code: {code}", + "sync_device": "Connected devices: {devices}", + "sync_enable": "Enable the synchronization function (because the data is transmitted in clear text, please use it under a trusted network)", + "sync_port": "Sync port settings", + "sync_port_tip": "Please enter the synchronization service port number", + "sync_refresh_code": "Refresh the connection code", "update": "Update", "update_checking": "Checking for updates...", "update_current_label": "Current version: ", diff --git a/src/renderer/lang/zh-cn/material/sync_mode_modal.json b/src/renderer/lang/zh-cn/material/sync_mode_modal.json new file mode 100644 index 00000000..e50ff220 --- /dev/null +++ b/src/renderer/lang/zh-cn/material/sync_mode_modal.json @@ -0,0 +1,19 @@ +{ + "merge_btn_local_remote": "本机列表 合并 远程列表", + "merge_btn_remote_local": "远程列表 合并 本机列表", + "merge_label": "合并", + "merge_tip": "合并:", + "merge_tip_desc": "将两边的列表合并到一起,相同的歌曲将被去掉(去掉的是被合并者的歌曲),不同的歌曲将被添加。", + "other_label": "其他", + "other_tip": "其他:", + "other_tip_desc": "“仅使用实时同步功能”将不修改双方的列表,仅实时同步操作;“取消同步”将直接断开双方的连接。", + "overwrite": "完全覆盖", + "overwrite_btn_cancel": "取消同步", + "overwrite_btn_local_remote": "本机列表 覆盖 远程列表", + "overwrite_btn_none": "仅使用实时同步功能", + "overwrite_btn_remote_local": "远程列表 覆盖 本机列表", + "overwrite_label": "覆盖", + "overwrite_tip": "覆盖:", + "overwrite_tip_desc": "被覆盖者与覆盖者列表ID相同的列表将被删除后替换成覆盖者的列表(列表ID不同的列表将被合并到一起),若勾选完全覆盖,则被覆盖者的所有列表将被移除,然后替换成覆盖者的列表。", + "title": "选择与 {name} 的列表同步方式" +} diff --git a/src/renderer/lang/zh-cn/view/setting.json b/src/renderer/lang/zh-cn/view/setting.json index 7ee36002..6c9a8fa5 100644 --- a/src/renderer/lang/zh-cn/view/setting.json +++ b/src/renderer/lang/zh-cn/view/setting.json @@ -130,6 +130,14 @@ "search_focus_search_box": "启动时自动聚焦搜索框", "search_history": "显示历史搜索记录", "search_hot": "显示热门搜索", + "sync": "数据同步 [此为测试功能,首次使用前建议先备份一次歌单]", + "sync_address": "同步服务地址:{address}", + "sync_auth_code": "连接码:{code}", + "sync_device": "已连接的设备:{devices}", + "sync_enable": "启用同步功能(由于数据是明文传输,请在受信任的网络下使用)", + "sync_port": "同步端口设置", + "sync_port_tip": "请输入同步服务端口号", + "sync_refresh_code": "刷新连接码", "update": "软件更新", "update_checking": "检查更新中...", "update_current_label": "当前版本:", diff --git a/src/renderer/lang/zh-tw/material/sync_mode_modal.json b/src/renderer/lang/zh-tw/material/sync_mode_modal.json new file mode 100644 index 00000000..bce8305b --- /dev/null +++ b/src/renderer/lang/zh-tw/material/sync_mode_modal.json @@ -0,0 +1,19 @@ +{ + "merge_btn_local_remote": "本機列表 合併 遠程列表", + "merge_btn_remote_local": "遠程列表 合併 本機列表", + "merge_label": "合併", + "merge_tip": "合併:", + "merge_tip_desc": "將兩邊的列表合併到一起,相同的歌曲將被去掉(去掉的是被合併者的歌曲),不同的歌曲將被添加。", + "other_label": "其他", + "other_tip": "其他:", + "other_tip_desc": "“僅使用實時同步功能”將不修改雙方的列表,僅實時同步操作;“取消同步”將直接斷開雙方的連接。", + "overwrite": "完全覆蓋", + "overwrite_btn_cancel": "取消同步", + "overwrite_btn_local_remote": "本機列表 覆蓋 遠程列表", + "overwrite_btn_none": "僅使用實時同步功能", + "overwrite_btn_remote_local": "遠程列表 覆蓋 本機列表", + "overwrite_label": "覆蓋", + "overwrite_tip": "覆蓋:", + "overwrite_tip_desc": "被覆蓋者與覆蓋者列表ID相同的列表將被刪除後替換成覆蓋者的列表(列表ID不同的列表將被合併到一起),若勾選完全覆蓋,則被覆蓋者的所有列表將被移除,然後替換成覆蓋者的列表。", + "title": "選擇與 {name} 的列表同步方式" +} diff --git a/src/renderer/lang/zh-tw/view/setting.json b/src/renderer/lang/zh-tw/view/setting.json index 79d82a22..4b9308de 100644 --- a/src/renderer/lang/zh-tw/view/setting.json +++ b/src/renderer/lang/zh-tw/view/setting.json @@ -130,6 +130,14 @@ "search_focus_search_box": "啟動時自動聚焦搜索框", "search_history": "顯示歷史搜索記錄", "search_hot": "顯示熱門搜索", + "sync": "數據同步 [此為測試功能,首次使用前建議先備份一次歌單]", + "sync_address": "同步服務地址:{address}", + "sync_auth_code": "連接碼:{code}", + "sync_device": "已連接的設備:{devices}", + "sync_enable": "啟用同步功能(由於數據是明文傳輸,請在受信任的網絡下使用)", + "sync_port": "同步端口設置", + "sync_port_tip": "請輸入同步服務端口號", + "sync_refresh_code": "刷新連接碼", "update": "軟件更新", "update_checking": "檢查更新中...", "update_current_label": "當前版本:", diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js index 13765a68..b53c6d71 100644 --- a/src/renderer/store/modules/list.js +++ b/src/renderer/store/modules/list.js @@ -1,10 +1,14 @@ import musicSdk from '../../utils/music' import { clearLyric, clearMusicUrl } from '../../utils' +import { sync as eventSyncName } from '@renderer/event/names' let allList = {} window.allList = allList const allListInit = (defaultList, loveList, userList) => { + for (const id of Object.keys(allList)) { + delete allList[id] + } allList[defaultList.id] = defaultList allList[loveList.id] = loveList for (const list of userList) allList[list.id] = list @@ -67,8 +71,28 @@ const mutations = { if (userList != null) state.userList = userList allListInit(state.defaultList, state.loveList, state.userList) state.isInitedList = true + + // if (!isSync) { + // window.eventHub.$emit(eventSyncName.send_action_list, { + // action: 'init_list', + // data: { defaultList, loveList, userList }, + // }) + // } }, - setList(state, { id, list, name, location, source, sourceListId }) { + setSyncListData(state, { defaultList, loveList, userList }) { + state.defaultList.list.splice(0, state.defaultList.list.length, ...defaultList.list) + state.loveList.list.splice(0, state.loveList.list.length, ...loveList.list) + state.userList = userList + allListInit(state.defaultList, state.loveList, state.userList) + }, + setList(state, { id, list, name, location, source, sourceListId, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'set_list', + data: { id, list, name, location, source, sourceListId }, + }) + } + const targetList = allList[id] if (targetList) { if (name && targetList.name === name) { @@ -90,11 +114,20 @@ const mutations = { state.userList.push(newList) allListUpdate(newList) }, - listAdd(state, { id, musicInfo }) { + listAdd(state, { id, musicInfo, addMusicLocationType, isSync }) { + if (!addMusicLocationType) addMusicLocationType = this.state.setting.list.addMusicLocationType + + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_add', + data: { id, musicInfo, addMusicLocationType }, + }) + } + const targetList = allList[id] if (!targetList) return if (targetList.list.some(s => s.songmid === musicInfo.songmid)) return - switch (this.state.setting.list.addMusicLocationType) { + switch (addMusicLocationType) { case 'top': targetList.list.unshift(musicInfo) break @@ -104,11 +137,18 @@ const mutations = { break } }, - listMove(state, { fromId, musicInfo, toId }) { + listMove(state, { fromId, musicInfo, toId, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_move', + data: { fromId, musicInfo, toId }, + }) + } + const fromList = allList[fromId] const toList = allList[toId] if (!fromList || !toList) return - fromList.list.splice(fromList.list.indexOf(musicInfo), 1) + fromList.list.splice(fromList.list.findIndex(s => s.songmid === musicInfo.songmid), 1) let index = toList.list.findIndex(s => s.songmid === musicInfo.songmid) if (index < 0) { switch (this.state.setting.list.addMusicLocationType) { @@ -122,41 +162,79 @@ const mutations = { } } }, - listAddMultiple(state, { id, list }) { + listAddMultiple(state, { id, list, addMusicLocationType, isSync }) { + if (!addMusicLocationType) addMusicLocationType = this.state.setting.list.addMusicLocationType + + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_add_multiple', + data: { id, list, addMusicLocationType }, + }) + } + let targetList = allList[id] if (!targetList) return let newList - switch (this.state.setting.list.addMusicLocationType) { + const map = {} + const ids = [] + switch (addMusicLocationType) { case 'top': newList = [...list, ...targetList.list] + for (let i = newList.length - 1; i > -1; i--) { + const item = newList[i] + if (map[item.songmid]) continue + ids.unshift(item.songmid) + map[item.songmid] = item + } break case 'bottom': default: newList = [...targetList.list, ...list] + for (const item of newList) { + if (map[item.songmid]) continue + ids.push(item.songmid) + map[item.songmid] = item + } break } - let map = {} - let ids = [] - for (const item of newList) { - if (map[item.songmid]) continue - ids.push(item.songmid) - map[item.songmid] = item - } targetList.list.splice(0, targetList.list.length, ...ids.map(id => map[id])) }, // { fromId, toId, list } - listMoveMultiple(state, { fromId, toId, list }) { + listMoveMultiple(state, { fromId, toId, list, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_move_multiple', + data: { fromId, toId, list }, + }) + } + // console.log(state.commit) - this.commit('list/listRemoveMultiple', { id: fromId, list }) - this.commit('list/listAddMultiple', { id: toId, list }) + this.commit('list/listRemoveMultiple', { listId: fromId, ids: list.map(s => s.songmid), isSync: true }) + this.commit('list/listAddMultiple', { id: toId, list, isSync: true }) }, - listRemove(state, { id, index }) { - let targetList = allList[id] + listRemove(state, { listId, id, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_remove', + data: { listId, id }, + }) + } + + let targetList = allList[listId] if (!targetList) return + const index = targetList.list.findIndex(item => item.songmid == id) + if (index < 0) return targetList.list.splice(index, 1) }, - listRemoveMultiple(state, { id, list }) { - let targetList = allList[id] + listRemoveMultiple(state, { listId, ids: musicIds, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_remove_multiple', + data: { listId, ids: musicIds }, + }) + } + + let targetList = allList[listId] if (!targetList) return let map = {} let ids = [] @@ -164,25 +242,50 @@ const mutations = { ids.push(item.songmid) map[item.songmid] = item } - for (const item of list) { - if (map[item.songmid]) delete map[item.songmid] + for (const songmid of musicIds) { + if (map[songmid]) delete map[songmid] } let newList = [] for (const id of ids) if (map[id]) newList.push(map[id]) targetList.list.splice(0, targetList.list.length, ...newList) }, - listClear(state, id) { + listClear(state, { id, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'list_clear', + data: { id }, + }) + } + let targetList = allList[id] if (!targetList) return targetList.list.splice(0, targetList.list.length) }, - updateMusicInfo(state, { id, index, data, musicInfo = {} }) { - let targetList = allList[id] - if (!targetList) return Object.assign(musicInfo, data) - Object.assign(targetList.list[index], data) + updateMusicInfo(state, { listId, id, data, musicInfo, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'update_music_info', + data: { listId, id, data, musicInfo }, + }) + } + + let targetList = allList[listId] + if (!targetList) { + if (musicInfo) Object.assign(musicInfo, data) + return + } + const targetMusicInfo = targetList.list.find(item => item.songmid == id) + if (targetMusicInfo) Object.assign(targetMusicInfo, data) }, - createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId }) { + createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'create_user_list', + data: { name, id, list, source, sourceListId }, + }) + } + let newList = state.userList.find(item => item.id === id) if (!newList) { newList = { @@ -196,35 +299,75 @@ const mutations = { state.userList.push(newList) allListUpdate(newList) } - this.commit('list/listAddMultiple', { id, list }) + this.commit('list/listAddMultiple', { id, list, isSync: true }) }, - removeUserList(state, index) { + removeUserList(state, { id, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'remove_user_list', + data: { id }, + }) + } + + const index = state.userList.findIndex(l => l.id === id) + if (index < 0) return let list = state.userList.splice(index, 1)[0] allListRemove(list) }, - setUserListName(state, { index, name }) { - let list = state.userList[index] + setUserListName(state, { id, name, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'set_user_list_name', + data: { id, name }, + }) + } + + let list = allList[id] if (!list) return list.name = name }, - moveupUserList(state, index) { - let targetList = state.userList[index] + moveupUserList(state, { id, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'moveup_user_list', + data: { id }, + }) + } + + const index = state.userList.findIndex(l => l.id == id) + if (index < 0) return + let targetList = allList[id] state.userList.splice(index, 1) state.userList.splice(index - 1, 0, targetList) }, - movedownUserList(state, index) { - let targetList = state.userList[index] + movedownUserList(state, { id, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'movedown_user_list', + data: { id }, + }) + } + const index = state.userList.findIndex(l => l.id == id) + if (index < 0) return + let targetList = allList[id] state.userList.splice(index, 1) state.userList.splice(index + 1, 0, targetList) }, setListScroll(state, { id, location }) { if (allList[id]) allList[id].location = location }, - sortList(state, { id, sortNum, musicInfos }) { - let targetList = allList[id] - this.commit('list/listRemoveMultiple', { id, list: musicInfos }) + setMusicPosition(state, { id, position, list, isSync }) { + if (!isSync) { + window.eventHub.$emit(eventSyncName.send_action_list, { + action: 'set_music_position', + data: { id, position, list }, + }) + } - targetList.list.splice(sortNum - 1, 0, ...musicInfos) + let targetList = allList[id] + this.commit('list/listRemoveMultiple', { listId: id, ids: list.map(m => m.songmid), isSync: true }) + + targetList.list.splice(position - 1, 0, ...list) }, clearCache() { const lists = Object.values(allList) diff --git a/src/renderer/store/modules/player.js b/src/renderer/store/modules/player.js index 9444d749..4f6c5ef7 100644 --- a/src/renderer/store/modules/player.js +++ b/src/renderer/store/modules/player.js @@ -141,6 +141,7 @@ const getLyric = function(musicInfo, retryedSource = [], originMusic) { }) } +let prevPlayIndex // getters const getters = { list: state => state.listInfo.list, @@ -156,13 +157,14 @@ const getters = { if (listId != '__temp__') { if (isPlayList) { - playIndex = state.listInfo.list.indexOf(state.playMusicInfo.musicInfo) + playIndex = state.listInfo.list.findIndex(m => m.songmid == state.playMusicInfo.musicInfo.songmid) if (!isTempPlay) listPlayIndex = playIndex } else { let list = window.allList[listId] - if (list) playIndex = list.list.indexOf(state.playMusicInfo.musicInfo) + if (list) playIndex = list.list.findIndex(m => m.songmid == state.playMusicInfo.musicInfo.songmid) } } + if (listPlayIndex > -1) prevPlayIndex = listPlayIndex // console.log({ // listId, // playIndex, @@ -170,7 +172,7 @@ const getters = { // listPlayIndex, // isPlayList, // isTempPlay, - // musicInfo: state.playMusicInfo.musicInfo, + // // musicInfo: state.playMusicInfo.musicInfo, // }) return { listId, @@ -250,9 +252,9 @@ const actions = { if (state.playedList.length) { // 从已播放列表移除播放列表已删除的歌曲 let index - for (index = state.playedList.indexOf(state.playMusicInfo) - 1; index > -1; index--) { + for (index = state.playedList.findIndex(m => m.songmid === state.playMusicInfo.musicInfo.songmid) - 1; index > -1; index--) { const playMusicInfo = state.playedList[index] - if (playMusicInfo.listId == currentListId && !currentList.includes(playMusicInfo.musicInfo)) { + if (playMusicInfo.listId == currentListId && !currentList.some(m => m.songmid === playMusicInfo.musicInfo.songmid)) { commit('removePlayedList', index) continue } @@ -273,7 +275,19 @@ const actions = { }) if (!filteredList.length) return commit('setPlayMusicInfo', null) const playInfo = getters.playInfo - let currentIndex = filteredList.indexOf(currentList[playInfo.listPlayIndex]) + let currentMusic + if (playInfo.listPlayIndex < 0) { + let index = prevPlayIndex + if (index > currentList.length - 1) index = 0 + while (index > -1) { + currentMusic = currentList[index] + if (currentMusic) break + index-- + } + } else { + currentMusic = currentList[playInfo.listPlayIndex] + } + let currentIndex = filteredList.findIndex(m => m.songmid == currentMusic.songmid) if (currentIndex == -1) currentIndex = 0 let nextIndex = currentIndex if (!playInfo.isTempPlay) { @@ -311,9 +325,9 @@ const actions = { if (state.playedList.length) { // 从已播放列表移除播放列表已删除的歌曲 let index - for (index = state.playedList.indexOf(state.playMusicInfo) + 1; index < state.playedList.length; index++) { + for (index = state.playedList.findIndex(m => m.songmid === state.playMusicInfo.musicInfo.songmid) + 1; index < state.playedList.length; index++) { const playMusicInfo = state.playedList[index] - if (playMusicInfo.listId == currentListId && !currentList.includes(playMusicInfo.musicInfo)) { + if (playMusicInfo.listId == currentListId && !currentList.some(m => m.songmid === playMusicInfo.musicInfo.songmid)) { commit('removePlayedList', index) continue } @@ -334,7 +348,19 @@ const actions = { if (!filteredList.length) return commit('setPlayMusicInfo', null) const playInfo = getters.playInfo - const currentIndex = filteredList.indexOf(currentList[playInfo.listPlayIndex]) + let currentMusic + if (playInfo.listPlayIndex < 0) { + let index = prevPlayIndex - 1 + if (index < 0) index = currentList.length - 1 + while (index > -1) { + currentMusic = currentList[index] + if (currentMusic) break + index-- + } + } else { + currentMusic = currentList[playInfo.listPlayIndex] + } + let currentIndex = filteredList.findIndex(m => m.songmid == currentMusic.songmid) let nextIndex = currentIndex switch (rootState.setting.player.togglePlayMethod) { case 'listLoop': @@ -433,7 +459,7 @@ const mutations = { playIndex = -1 } else { let listId = playMusicInfo.listId - if (listId != '__temp__' && !playMusicInfo.isTempPlay && listId === state.listInfo.id) playIndex = state.listInfo.list.indexOf(playMusicInfo.musicInfo) + if (listId != '__temp__' && !playMusicInfo.isTempPlay && listId === state.listInfo.id) playIndex = state.listInfo.list.findIndex(m => m.songmid == playMusicInfo.musicInfo.songmid) } state.playMusicInfo = playMusicInfo diff --git a/src/renderer/utils/music/kg/songList.js b/src/renderer/utils/music/kg/songList.js index 97f5e0cf..fc20d4aa 100644 --- a/src/renderer/utils/music/kg/songList.js +++ b/src/renderer/utils/music/kg/songList.js @@ -165,7 +165,9 @@ export default { : result.body.err_code ) !== 0) ) return this.createHttp(url, options, ++retryNum) - return result.body.data || result.body.info + if (result.body.data) return result.body.data + if (Array.isArray(result.body.info)) return result.body + return result.body.info }, createTask(hashs) { @@ -183,9 +185,9 @@ export default { let list = hashs let tasks = [] while (list.length) { - tasks.push(Object.assign({ data: list.slice(0, 20) }, data)) - if (list.length < 20) break - list = list.slice(20) + tasks.push(Object.assign({ data: list.slice(0, 100) }, data)) + if (list.length < 100) break + list = list.slice(100) } let url = 'http://kmr.service.kugou.com/v2/album_audio/audio' return tasks.map(task => this.createHttp(url, { @@ -267,6 +269,68 @@ export default { } }, + deDuplication(datas) { + let ids = new Set() + return datas.filter(({ hash }) => { + if (ids.has(hash)) return false + ids.add(hash) + return true + }) + }, + + async getUserListDetailByLink({ info }, link) { + let listInfo = info['0'] + let total = listInfo.count + let tasks = [] + let page = 0 + while (total) { + const limit = total > 90 ? 90 : total + total -= limit + page += 1 + tasks.push(this.createHttp(link.replace(/pagesize=\d+/, 'pagesize=' + limit).replace(/page=\d+/, 'page=' + page), { + headers: { + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1', + Referer: link, + }, + }).then(data => data.list.info)) + } + let result = await Promise.all(tasks).then(([...datas]) => datas.flat()) + result = await Promise.all(this.createTask(this.deDuplication(result).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) + // console.log(result) + return { + list: this.filterData2(result) || [], + page, + limit: this.listDetailLimit, + total: listInfo.count, + source: 'kg', + info: { + name: listInfo.name, + img: listInfo.pic && listInfo.pic.replace('{size}', 240), + // desc: body.result.info.list_desc, + author: listInfo.list_create_username, + // play_count: this.formatPlayCount(listInfo.count), + }, + } + }, + createGetListDetail2Task(id, total) { + let tasks = [] + let page = 0 + while (total) { + const limit = total > 300 ? 300 : total + total -= limit + page += 1 + tasks.push(this.createHttp('https://mobiles.kugou.com/api/v5/special/song_v2?appid=1058&global_specialid=' + id + '&specialid=0&plat=0&version=8000&page=' + page + '&pagesize=' + limit + '&srcappid=2919&clientver=20000&clienttime=1586163263991&mid=1586163263991&uuid=1586163263991&dfid=-&signature=' + toMD5('NVPh5oo715z5DIWAeQlhMDsWXXQV4hwtappid=1058clienttime=1586163263991clientver=20000dfid=-global_specialid=' + id + 'mid=1586163263991page=' + page + 'pagesize=' + limit + 'plat=0specialid=0srcappid=2919uuid=1586163263991version=8000NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'), { + headers: { + mid: '1586163263991', + Referer: 'https://m3ws.kugou.com/share/index.php', + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', + dfid: '-', + clienttime: '1586163263991', + }, + }).then(data => data.info)) + } + return Promise.all(tasks).then(([...datas]) => datas.flat()) + }, async getUserListDetail2(global_collection_id) { let id = global_collection_id if (id.length > 1000) throw new Error('get list error') @@ -279,22 +343,14 @@ export default { clienttime: '1586163242519', }, }) - let songInfo = await this.createHttp('https://mobiles.kugou.com/api/v5/special/song_v2?appid=1058&global_specialid=' + id + '&specialid=0&plat=0&version=8000&pagesize=' + info.songcount + '&srcappid=2919&clientver=20000&clienttime=1586163263991&mid=1586163263991&uuid=1586163263991&dfid=-&signature=' + toMD5('NVPh5oo715z5DIWAeQlhMDsWXXQV4hwtappid=1058clienttime=1586163263991clientver=20000dfid=-global_specialid=' + id + 'mid=1586163263991pagesize=' + info.songcount + 'plat=0specialid=0srcappid=2919uuid=1586163263991version=8000NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'), { - headers: { - mid: '1586163263991', - Referer: 'https://m3ws.kugou.com/share/index.php', - 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', - dfid: '-', - clienttime: '1586163263991', - }, - }) - let result = await Promise.all(this.createTask(songInfo.info.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) + const songInfo = await this.createGetListDetail2Task(id, info.songcount) + let result = await Promise.all(this.createTask(this.deDuplication(songInfo).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) // console.log(info, songInfo) return { list: this.filterData2(result) || [], page: 1, - limit: songInfo.total, - total: songInfo.total, + limit: this.listDetailLimit, + total: info.songcount, source: 'kg', info: { name: info.specialname, @@ -333,10 +389,9 @@ export default { // console.log(body, location) if (statusCode > 400) return this.getUserListDetail(link, page, ++retryNum) if (location) { + // console.log(location) if (location.includes('global_collection_id')) return this.getUserListDetail2(location.replace(/^.*?global_collection_id=(\w+)(?:&.*$|#.*$|$)/, '$1')) if (location.includes('chain=')) return this.getUserListDetail3(location.replace(/^.*?chain=(\w+)(?:&.*$|#.*$|$)/, '$1'), page) - - // console.log('location', location) if (location.includes('.html')) { if (location.includes('zlist.html')) { let link = location.replace(/^(.*)zlist\.html/, 'https://m3ws.kugou.com/zlist/list') @@ -348,27 +403,12 @@ export default { return this.getUserListDetail(link, page, ++retryNum) } else return this.getUserListDetail3(location.replace(/.+\/(\w+).html(?:\?.*|&.*$|#.*$|$)/, '$1'), page) } + // console.log('location', location) return this.getUserListDetail(link, page, ++retryNum) } if (typeof body == 'string') return this.getUserListDetail2(body.replace(/^[\s\S]+?"global_collection_id":"(\w+)"[\s\S]+?$/, '$1')) if (body.errcode !== 0) return this.getUserListDetail(link, page, ++retryNum) - let listInfo = body.info['0'] - let result = body.list.info.map(item => ({ hash: item.hash })) - result = await Promise.all(this.createTask(result)).then(([...datas]) => datas.flat()) - return { - list: this.filterData2(result) || [], - page, - limit: this.listDetailLimit, - total: listInfo.count, - source: 'kg', - info: { - name: listInfo.name, - img: listInfo.pic && listInfo.pic.replace('{size}', 240), - // desc: body.result.info.list_desc, - author: listInfo.list_create_username, - // play_count: this.formatPlayCount(listInfo.count), - }, - } + return this.getUserListDetailByLink(body, link) }, getListDetail(id, page, tryNum = 0) { // 获取歌曲列表内的音乐 diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index d71f876c..e9022860 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -355,7 +355,7 @@ export default { 'removeUserList', 'setListScroll', 'setList', - 'sortList', + 'setMusicPosition', ]), ...mapActions('songList', ['getListDetailAll']), ...mapActions('leaderboard', { @@ -576,7 +576,7 @@ export default { this.setPlayList({ list: this.listData, index }) }, handleRemove(index) { - this.listRemove({ id: this.listId, index }) + this.listRemove({ listId: this.listId, id: this.list[index].songmid }) }, handleListBtnClick(info) { switch (info.action) { @@ -677,8 +677,9 @@ export default { let dom_target = this.$refs.dom_lists_list.querySelector('.' + this.$style.editing) if (dom_target) dom_target.classList.remove(this.$style.editing) let name = event.target.value.trim() - if (name.length) return this.setUserListName({ index, name }) - event.target.value = this.userList[index].name + const targetList = this.userList[index] + if (name.length) return this.setUserListName({ id: targetList.id, name }) + event.target.value = targetList.name }, handleListsCreate(event) { if (event.target.readonly) return @@ -774,13 +775,13 @@ export default { this.handleSyncSourceList(index) break case 'moveup': - this.moveupUserList(index) + this.moveupUserList({ id: this.userList[index].id }) break case 'movedown': - this.movedownUserList(index) + this.movedownUserList({ id: this.userList[index].id }) break case 'remove': - this.removeUserList(index) + this.removeUserList({ id: this.userList[index].id }) break } }, @@ -870,7 +871,7 @@ export default { break case 'remove': if (this.selectdListDetailData.length) { - this.listRemoveMultiple({ id: this.listId, list: this.selectdListDetailData }) + this.listRemoveMultiple({ listId: this.listId, ids: this.selectdListDetailData.map(m => m.songmid) }) this.removeAllSelectListDetail() } else { this.handleRemove(index) @@ -929,10 +930,10 @@ export default { }, handleSortMusicInfo(num) { num = Math.min(num, this.list.length) - this.sortList({ + this.setMusicPosition({ id: this.listId, - sortNum: num, - musicInfos: this.selectdListDetailData.length ? [...this.selectdListDetailData] : [this.musicInfo], + position: num, + list: this.selectdListDetailData.length ? [...this.selectdListDetailData] : [this.musicInfo], }) this.removeAllSelectListDetail() this.isShowListSortModal = false diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue index ada914d9..31774c21 100644 --- a/src/renderer/views/Setting.vue +++ b/src/renderer/views/Setting.vue @@ -150,6 +150,21 @@ div(:class="$style.main") div material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" :label="$t('view.setting.is_enable')") + dt#sync {{$t('view.setting.sync')}} + dd + material-checkbox(id="setting_sync_enable" v-model="current_setting.sync.enable" @change="handleSyncChange('enable')" :label="syncEnableTitle") + div + p.small {{$t('view.setting.sync_auth_code', { code: sync.status.code || '' })}} + p.small {{$t('view.setting.sync_address', { address: sync.status.address.join(', ') || '' })}} + p.small {{$t('view.setting.sync_device', { devices: syncDevices })}} + p + material-btn(:class="$style.btn" min :disabled="!sync.status.status" @click="handleRefreshSyncCode") {{$t('view.setting.sync_refresh_code')}} + dd + h3#sync_port {{$t('view.setting.sync_port')}} + div + p + material-input(:class="$style.gapLeft" v-model.trim="current_setting.sync.port" @change="handleSyncChange('port')" :placeholder="$t('view.setting.sync_port_tip')") + dt#hot_key {{$t('view.setting.hot_key')}} dd h3#hot_key_local_title {{$t('view.setting.hot_key_local_title')}} @@ -295,7 +310,7 @@ import { getSetting, saveSetting, } from '../utils' -import { rendererSend, rendererInvoke, NAMES } from '@common/ipc' +import { rendererSend, rendererInvoke, rendererOn, NAMES, rendererOff } from '@common/ipc' import { mergeSetting, isMac } from '../../common/utils' import apiSourceInfo from '../utils/music/api-source-info' import fs from 'fs' @@ -410,6 +425,21 @@ export default { }, ] }, + syncEnableTitle() { + let title = this.$t('view.setting.sync_enable') + if (this.sync.status.message) { + title += ` [${this.sync.status.message}]` + } + // else if (this.sync.status.address.length) { + // // title += ` [${this.sync.status.address.join(', ')}]` + // } + return title + }, + syncDevices() { + return this.sync.status.devices.length + ? this.sync.status.devices.map(d => `${d.deviceName} (${d.clientId.substring(0, 5)})`).join(', ') + : '' + }, }, data() { return { @@ -474,6 +504,10 @@ export default { isToTray: false, themeId: 0, }, + sync: { + enable: false, + port: '23332', + }, windowSizeId: 1, langId: 'cns', themeId: 0, @@ -608,6 +642,15 @@ export default { }, isDisabledResourceCacheClear: false, isDisabledListCacheClear: false, + sync: { + status: { + status: false, + message: '', + address: [], + code: '', + devices: [], + }, + }, } }, watch: { @@ -665,6 +708,7 @@ export default { window.eventHub.$off(eventBaseName.set_config, this.handleUpdateSetting) window.eventHub.$off(eventBaseName.key_down, this.handleKeyDown) window.eventHub.$off(eventBaseName.set_hot_key_config, this.handleUpdateHotKeyConfig) + this.syncUnInit() if (this.current_setting.network.proxy.enable && !this.current_setting.network.proxy.host) window.globalObj.proxy.enable = false }, @@ -684,6 +728,7 @@ export default { this.current_hot_key = window.appHotKeyConfig this.initHotKeyConfig() this.getHotKeyStatus() + this.syncInit() }, // initTOC() { // const list = this.$refs.dom_setting_list.children @@ -1151,6 +1196,42 @@ export default { return status }, + setStatus(e, status) { + this.sync.status.status = status.status + this.sync.status.message = status.message + this.sync.status.address = status.address + this.sync.status.code = status.code + this.sync.status.devices = status.devices + }, + syncInit() { + rendererInvoke(NAMES.mainWindow.sync_get_status).then(status => { + this.sync.status.status = status.status + this.sync.status.message = status.message + this.sync.status.address = status.address + this.sync.status.code = status.code + this.sync.status.devices = status.devices + }) + rendererOn(NAMES.mainWindow.sync_status, this.setStatus) + }, + syncUnInit() { + rendererOff(NAMES.mainWindow.sync_status, this.setStatus) + }, + handleSyncChange(action) { + switch (action) { + case 'port': + if (!this.current_setting.sync.enable) return + case 'enable': + rendererInvoke(NAMES.mainWindow.sync_enable, { + enable: this.current_setting.sync.enable, + port: this.current_setting.sync.port, + }) + window.globalObj.sync.enable = this.current_setting.sync.enable + break + } + }, + handleRefreshSyncCode() { + rendererInvoke(NAMES.mainWindow.sync_generate_code) + }, }, }