diff --git a/.dockerignore b/.dockerignore index 8e932feb8..99a8c7683 100644 --- a/.dockerignore +++ b/.dockerignore @@ -201,3 +201,7 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + +.git +modules/server/logs +modules/agent/logs diff --git a/.gitee/ISSUE_TEMPLATE/config.yaml b/.gitee/ISSUE_TEMPLATE/config.yaml index 4aa898a76..31ce0cf79 100644 --- a/.gitee/ISSUE_TEMPLATE/config.yaml +++ b/.gitee/ISSUE_TEMPLATE/config.yaml @@ -1,3 +1,26 @@ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Code Technology Studio +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + blank_issues_enabled: false contact_links: - name: Jpom 官方文档 diff --git a/.gitignore b/.gitignore index 224905b56..cee4098a4 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ yarn-error.log .idea yarn.lock package-lock.json +pnpm-lock.yaml *bak pom.xml.versionsBackup #.vscode diff --git a/CHANGELOG-BETA.md b/CHANGELOG-BETA.md index ec447750c..081072e79 100644 --- a/CHANGELOG-BETA.md +++ b/CHANGELOG-BETA.md @@ -1,5 +1,92 @@ # 🚀 版本日志 +### 2.10.42.5-beta + +### 🐣 新增功能 + +1. 【server】新增 集群化管理工作空间(感谢@定格、[@paobu](https://gitee.com/iniushi) [Gitee issues I7UG5V](https://gitee.com/dromara/Jpom/issues/I7UG5V)) + +### 🐞 解决BUG、优化功能 + +1. 【server】修复 资产管理 SSH 管理系统名称显示未知问题(感谢@勤思·) +2. 【server】优化 资产管理 Docker 管理支持配置分组 +3. 【server】优化 仓库管理支持配置分组 +4. 【server】优化 SSH 文件夹支持前端排序(感谢@勤思·) + +------ + +### 2.10.42.4-beta (2023-08-19) + +### 🐣 新增功能 + +1. 【server】优化 ssh 相关功能支持 openssh8+ + (感谢 [@孤城落寞](https://gitee.com/gclm) [Gitee pr 193](https://gitee.com/dromara/Jpom/pulls/193) ) + +### 🐞 解决BUG、优化功能 + +1. 【server】优化 仓库账号、 SSH 证书密码支持选择环境变量 +2. 【all】升级 commons-compress、fastjson、hutool 版本 +3. 【server】优化 maven 依赖冲突 +4. 【server】优化 文件发布-节点发布文件名使用真实名称(感谢@勤思·) +5. 【server】优化 文件发布-ssh发布新增变量:FILE_NAME、FILE_EXT_NAME + +------ + +### 2.10.42.3-beta (2023-08-04) + +### 🐣 新增功能 + +1. 【server】新增 SSH + 文件管理修改文件权限功能(感谢 [@MichelleChung](https://gitee.com/michelle1028) [Gitee issues I6VDXS](https://gitee.com/dromara/Jpom/issues/I6VDXS) ) + +### 🐞 解决BUG、优化功能 + +1. 【server】升级 h2、SpringBoot 版本 +2. 【server】使用系统git时,无法克隆tag问题优化 (感谢@唐明) +3. 【server】优化 SSH 和 代码仓库的密码从工作空间变量中读取 + +------ + +### 2.10.42.2-beta (2023-07-04) + +### 🐣 新增功能 + +1. 【server】新增 Docker 容器重建功能,即删除原有的容器,重新创建一个新的容器 + +### 🐞 解决BUG、优化功能 + +1. 【server】优化 + 删除工作空间前预检查关联数据存在情况(感谢 [@陈旭](https://gitee.com/chenxu8989) [Gitee issues I7F0ZN](https://gitee.com/dromara/Jpom/issues/I7F0ZN) ) +2. 【server】优化 + 退出登录支持彻底退出、切换账号退出(感谢 [@wangfubiao](https://gitee.com/wangfubiao) [Gitee issues I7GA5Q](https://gitee.com/dromara/Jpom/issues/I7GA5Q) ) +3. 【server】优化 IP 白名单验证忽略 IPV6 情况 +4. 【server】优化 服务端缓存管理支持查看黑名单 IP 详细信息(感谢@酱总) + +------ + +### 2.10.42.1-beta (2023-06-26) + +### 🐣 新增功能 + +1. 【server】新增 Docker 管理增加 SSH 连接 + +### 🐞 解决BUG、优化功能 + +1. 【server】修复 SSH + 编辑输入框出现部分关键词时保持报错(感谢 [@一只羊](https://gitee.com/hjdyzy) [Gitee issues I7E3UG](https://gitee.com/dromara/Jpom/issues/I7E3UG) ) +2. 【server】优化 日志组件支持显示 \t 制表符、清空缓冲区滚动到顶部 +3. 【server】修复 彻底删除节点分发时未自动删除关联日志(感谢@ccx2480) +4. 【server】修复 + 节点管理中脚本模板翻页无效(感谢 [@wangfubiao](https://gitee.com/wangfubiao) [Gitee issues I7F0RS](https://gitee.com/dromara/Jpom/issues/I7F0RS) ) +5. 【server】优化 + 工作空间配置页面中新增节点分发白名单配置入口(感谢 [@陈旭](https://gitee.com/chenxu8989) [Gitee issues I7F0W0](https://gitee.com/dromara/Jpom/issues/I7F0W0) ) +6. 【server】优化 构建附加环境变量支持解析 URL 参数格式 + (感谢 [@爱琳琳真是太好了](https://gitee.com/qiqi513_admin) [Gitee issues I7FROG](https://gitee.com/dromara/Jpom/issues/I7FROG) ) +7. 【server】优化 构建支持单个配置保留天数和保留个数 + (感谢 [@阿超](https://gitee.com/VampireAchao) [Gitee issues I7FOG2](https://gitee.com/dromara/Jpom/issues/I7FOG2) ) + +------ + ### 2.10.41.3-beta (2023-06-12) ### 🐣 新增功能 @@ -16,7 +103,8 @@ 4. 【server】优化 页面滚动条样式 5. 【server】优化 编辑关联分发,选择项目下拉框不能显示项目全名称(tooltip)(感谢@LYY) 6. 【server】优化 监听页面关闭事件,主动关闭 websocket -7. 【server】修复 批量构建触发器无法正常使用(感谢 [@botboy](https://github.com/cheakin) [Github issues 48](https://github.com/dromara/Jpom/issues/48) ) +7. 【server】修复 + 批量构建触发器无法正常使用(感谢 [@botboy](https://github.com/cheakin) [Github issues 48](https://github.com/dromara/Jpom/issues/48) ) ### ⚠️ 注意 @@ -50,8 +138,10 @@ 1. 【server】优化 资产管理支持管理共享仓库 2. 【server】优化 增大验证码检测功能异常捕捉范围 -3. 【server】修复 令牌导入仓库令牌长度不足问题(感谢 [@Sherman Chu](https://github.com/yeliulee) [Github issues 45](https://github.com/dromara/Jpom/issues/45) ) -4. 【server】修复 分发列表配置功能无法使用(感谢 [@Free](https://gitee.com/fjlyy321) [Gitee issues I716UI](https://gitee.com/dromara/Jpom/issues/I716UI) ) +3. 【server】修复 + 令牌导入仓库令牌长度不足问题(感谢 [@Sherman Chu](https://github.com/yeliulee) [Github issues 45](https://github.com/dromara/Jpom/issues/45) ) +4. 【server】修复 + 分发列表配置功能无法使用(感谢 [@Free](https://gitee.com/fjlyy321) [Gitee issues I716UI](https://gitee.com/dromara/Jpom/issues/I716UI) ) 5. 【server】修复 构建卡片布局、构建详情中构建方式显示不正确(感谢@A) ------ @@ -60,8 +150,10 @@ ### 🐞 解决BUG、优化功能 -1. 【server】修复 仓库编辑清除密码按钮弹窗层级问题(感谢 [@轩辕豆豆](https://gitee.com/xuanyuandoudou) [Gitee issues I6VSCR](https://gitee.com/dromara/Jpom/issues/I6VSCR) ) -2. 【server】修复 优化构建列表卡片布局存在未构建数据布局错乱问题(感谢 [@lin_yeqi](https://gitee.com/lin_yeqi) [Gitee issues I6VUB7](https://gitee.com/dromara/Jpom/issues/I6VUB7) ) +1. 【server】修复 + 仓库编辑清除密码按钮弹窗层级问题(感谢 [@轩辕豆豆](https://gitee.com/xuanyuandoudou) [Gitee issues I6VSCR](https://gitee.com/dromara/Jpom/issues/I6VSCR) ) +2. 【server】修复 + 优化构建列表卡片布局存在未构建数据布局错乱问题(感谢 [@lin_yeqi](https://gitee.com/lin_yeqi) [Gitee issues I6VUB7](https://gitee.com/dromara/Jpom/issues/I6VUB7) ) ------ @@ -69,7 +161,7 @@ ### 🐞 解决BUG、优化功能 -1. 【server】修复 在线更新无法正常使用 +1. 【server】修复 在线更新无法正常使用 ------ @@ -77,7 +169,8 @@ ### 🐣 新增功能 -1. 【server】新增 容器构建中对 gradle 插件的支持(感谢 [@xiaozhi](https://gitee.com/XiaoZhiGongChengShi) [Gitee pr 188](https://gitee.com/dromara/Jpom/pulls/188) ) +1. 【server】新增 容器构建中对 gradle + 插件的支持(感谢 [@xiaozhi](https://gitee.com/XiaoZhiGongChengShi) [Gitee pr 188](https://gitee.com/dromara/Jpom/pulls/188) ) ### 🐞 解决BUG、优化功能 @@ -97,7 +190,8 @@ 1. 【server】修复 清空浏览器缓存未跳转到登录页面 2. 【server】优化 构建拉取 git 仓库支持使用服务器中的 git 插件,实现配置克隆深度参数 -3. 【server】修复 删除节点脚本报错(感谢 [@xiaozhi](https://gitee.com/XiaoZhiGongChengShi) [Gitee issues I6USMY](https://gitee.com/dromara/Jpom/issues/I6USMY) ) +3. 【server】修复 + 删除节点脚本报错(感谢 [@xiaozhi](https://gitee.com/XiaoZhiGongChengShi) [Gitee issues I6USMY](https://gitee.com/dromara/Jpom/issues/I6USMY) ) ------ @@ -141,7 +235,6 @@ ------ - ### 2.10.39.4-beta (2023-04-03) ### 🐞 解决BUG、优化功能 @@ -196,7 +289,6 @@ ### 2.10.38.10-beta (2023-03-30) - ### 🐞 解决BUG、优化功能 1. 【server】修复 节点脚本支持全局共享同步节点、节点管理查看脚本重复问题(感谢@奇奇) @@ -232,7 +324,7 @@ ### 🐣 新增功能 -1. 【server】新增 构建新增配置排除发布目录表达式(感谢@毛毛虫) +1. 【server】新增 构建新增配置排除发布目录表达式(感谢@毛毛虫) ### 🐞 解决BUG、优化功能 @@ -298,7 +390,8 @@ ### 🐣 新增功能 -1. 【server】新增 支持 oauth2 登录 (感谢 [@MaxKeyTop](https://gitee.com/maxkeytop_admin) [Gitee pr 183](https://gitee.com/dromara/Jpom/pulls/183) ) +1. 【server】新增 支持 oauth2 登录 + (感谢 [@MaxKeyTop](https://gitee.com/maxkeytop_admin) [Gitee pr 183](https://gitee.com/dromara/Jpom/pulls/183) ) ### 🐞 解决BUG、优化功能 diff --git a/PLANS.md b/PLANS.md index 0c9463446..ad2a97d56 100644 --- a/PLANS.md +++ b/PLANS.md @@ -3,60 +3,66 @@ ## 2.10.x 1. **构建流水线** -2. **资产管理** +2. **netty-agent** +3. 凭证管理 +4. 升级 JDK 11 或者 17 +5. 端口监控、监控报警、机器监控、ssh 监控报警 +6. 资产监控 +7. nginx 流量切换(nginx 功能可能下线) +8. acme.sh ui +9. 执行审计 +10. 执行部分命令耗时和直接执行相差太大 +11. **非 root 用户提升权限写入 root 用户文件** +12. 部分数据迁移工作空间(项目,构建,仓库、节点分发) +13. 前端表格用户自定义列显示 +14. 前端升级 vue3 +15. `导入云效仓库 (zx) 依赖太重,非单接口实现(需要标准验证流程)` +16. 节点取消,白名单配置和下载白名单(统一到服务端工作空间配置) +17. ~~仓库~~、构建、分发、~~项目~~导入导出 +18. 隧道节点 +19. ~~docker 容器编辑重建(zx)~~ +20. 前端主题切换 +21. docker-compose sh +22. ~~仓库密码、ssh 密码引用环境变量支持使用下拉框 sh~~ +23. 监控通知模块优化支持更多(飞书) zx +24. SSH 修改文件权限 zx +25. vue3 资产管理 zs +26. vue3 用户管理 zs + +### DONE + +1. ~~SSH 连接 docker (sh)~~ +2. ~~批量删除镜像 (sh)~~ +3. **资产管理** 1. ~~机器管理~~ 2. ~~机器监控~~ 3. ~~SSH 管理~~ 4. ~~dokcer 管理~~ 5. ~~docker 集群~~ 6. ~~ssh 监控~~ - 7. 仓库管理(待定,可以和凭证管理一起考虑) -3. netty-agent -4. 凭证管理 -5. 升级 JDK 11 或者 17 -6. 端口监控、监控报警、机器监控、ssh 监控报警 -7. nginx 流量切换 -8. acme.sh ui -9. 执行审计 -10. 执行部分命令耗时和直接执行相差太大 -11. 监控通知模块优化支持更多(飞书) -12. **非 root 用户提升权限写入 root 用户文件** -13. 部分数据迁移工作空间(项目,构建,仓库、节点分发) -14. 前端表格用户自定义列显示 -15. 前端升级 vue3 -16. `导入云效仓库 (zx) 依赖太重,非单接口实现(需要标准验证流程)` -17. 节点取消,白名单配置和下载白名单(统一到服务端工作空间配置) -18. ~~仓库~~、构建、分发、~~项目~~导入导出 -19. SSH 连接 docker (sh) -20. docker-compose -21. 隧道节点 -22. 批量删除镜像 (sh) -23. docker 容器编辑重建(zx) -24. 仓库引用环境变量支持使用下拉框 - -### DONE -1. ~~使用服务端的 git 插件~~ -2. ~~日志组件卡顿~~ -3. ~~清理触发器表~~ -4. ~~scp 发布实践案例~~ -5. ~~SSH 上传文件进度(前端分片+进度)~~ -6. ~~**用户体系支持接入第三方系统**~~ -7. ~~传输信息加密(混淆,避免 http 明文传输)~~ -8. ~~插件端证书验证迁移到服务端~~ -9. ~~稳定版/体验版~~ -10. ~~插件端自定义发布文件~~ -11. ~~容器构建基础镜像的管理~~ -12. ~~tomcat 实践案例~~ -13. ~~**分片上传文件**~~ -14. ~~**支持 mysql 数据库**~~ -15. ~~配置文件优化~~ -16. ~~项目触发器~~ -17. ~~节点转发模块优化~~ -18. ~~构建事件触发新增更多(前后)~~ -19. ~~复制项目~~ -20. ~~测命令行参数~~ -21. ~~标签页缓存问题(定时器未清空)~~ -22. ~~发布到指定目录~~ + 7. ~~仓库管理(待定,可以和凭证管理一起考虑)~~ +4. ~~使用服务端的 git 插件~~ +5. ~~日志组件卡顿~~ +6. ~~清理触发器表~~ +7. ~~scp 发布实践案例~~ +8. ~~SSH 上传文件进度(前端分片+进度)~~ +9. ~~**用户体系支持接入第三方系统**~~ +10. ~~传输信息加密(混淆,避免 http 明文传输)~~ +11. ~~插件端证书验证迁移到服务端~~ +12. ~~稳定版/体验版~~ +13. ~~插件端自定义发布文件~~ +14. ~~容器构建基础镜像的管理~~ +15. ~~tomcat 实践案例~~ +16. ~~**分片上传文件**~~ +17. ~~**支持 mysql 数据库**~~ +18. ~~配置文件优化~~ +19. ~~项目触发器~~ +20. ~~节点转发模块优化~~ +21. ~~构建事件触发新增更多(前后)~~ +22. ~~复制项目~~ +23. ~~测命令行参数~~ +24. ~~标签页缓存问题(定时器未清空)~~ +25. ~~发布到指定目录~~ ## 2.8.x diff --git a/README.md b/README.md index 16937cb8f..961242cb8 100644 --- a/README.md +++ b/README.md @@ -289,6 +289,7 @@ docker-compose -f docker-compose.yml up # docker-compose -f docker-compose.yml build --no-cache # docker-compose -f docker-compose-local.yml up # docker-compose -f docker-compose-local.yml build --build-arg TEMP_VERSION=.0 +# docker-compose -f docker-compose-cluster.yml up --build ``` ### 方式六:💻 编译运行 diff --git a/SECURITY.md b/SECURITY.md index 97c198339..8330946a8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,6 +7,7 @@ currently being supported with security updates. | Version | Supported | |-------------|--------------------| +| 2.10.x | :white_check_mark: | | 2.9.x | :white_check_mark: | | 2.8.x | :x: | | 2.8.1-2.8.6 | :x: | diff --git a/docker-compose-cluster.yml b/docker-compose-cluster.yml new file mode 100644 index 000000000..3bd2638e9 --- /dev/null +++ b/docker-compose-cluster.yml @@ -0,0 +1,85 @@ +version: '3.8' +services: + server: + env_file: + - env-beta.env + image: jpomdocker/jpom:server-${JPOM_VERSION} + build: + dockerfile: ./modules/server/Dockerfile + context: . + args: + JPOM_VERSION: ${JPOM_VERSION} + environment: + "JPOM_SERVER_TEMP_TOKEN": ${SERVER_TOKEN} + "jpom.cluster.id": server00 + volumes: + - jpom-server-data:/usr/local/jpom-server/data + - jpom-server-logs:/usr/local/jpom-server/logs + - jpom-server-conf:/usr/local/jpom-server/conf + ports: + - "2122:2122" + hostname: server + server01: + env_file: + - env-beta.env + image: jpomdocker/jpom:server-${JPOM_VERSION} + build: + dockerfile: ./modules/server/Dockerfile + context: . + args: + JPOM_VERSION: ${JPOM_VERSION} + environment: + "JPOM_SERVER_TEMP_TOKEN": ${SERVER_TOKEN} + "jpom.cluster.id": server01 + volumes: + - jpom-server01-data:/usr/local/jpom-server/data + - jpom-server01-logs:/usr/local/jpom-server/logs + - jpom-server01-conf:/usr/local/jpom-server/conf + ports: + - "2120:2122" + hostname: server01 + agent01: + env_file: + - env-beta.env + image: jpomdocker/jpom:agent-${JPOM_VERSION} + build: + dockerfile: ./modules/agent/Dockerfile + context: . + args: + JPOM_VERSION: ${JPOM_VERSION} + RUN_ARG: --auto-push-to-server 'http://server:2122/api/node/receive_push?token=${SERVER_TOKEN}&workspaceId=DEFAULT' + + volumes: + - jpom-agent01:/usr/local/jpom-agent + ports: + - "2123:2123" + depends_on: + - server + hostname: agent01 + agent02: + env_file: + - env-beta.env + image: jpomdocker/jpom:agent-${JPOM_VERSION} + build: + dockerfile: ./modules/agent/Dockerfile + context: . + args: + JPOM_VERSION: ${JPOM_VERSION} + RUN_ARG: --auto-push-to-server 'http://server01:2122/api/node/receive_push?token=${SERVER_TOKEN}&workspaceId=DEFAULT' + + volumes: + - jpom-agent02:/usr/local/jpom-agent + ports: + - "2124:2123" + depends_on: + - server01 + hostname: agent02 +volumes: + jpom-agent01: + jpom-agent02: + jpom-server-data: + jpom-server-logs: + jpom-server-conf: + jpom-server01-data: + jpom-server01-logs: + jpom-server01-conf: diff --git a/env-beta.env b/env-beta.env index a3b000d45..cf51d718c 100644 --- a/env-beta.env +++ b/env-beta.env @@ -1,3 +1,3 @@ -JPOM_VERSION=2.10.41.3 +JPOM_VERSION=2.10.42.4 # Server Token 生产部署请更换 SERVER_TOKEN=7094f673-2c53-4fc1-82e7-86e528449d97 diff --git a/modules/agent-transport/agent-transport-common/pom.xml b/modules/agent-transport/agent-transport-common/pom.xml index 11e35465f..d8bedd856 100644 --- a/modules/agent-transport/agent-transport-common/pom.xml +++ b/modules/agent-transport/agent-transport-common/pom.xml @@ -30,7 +30,7 @@ org.dromara.jpom.agent-transport jpom-agent-transport-parent - 2.10.41 + 2.10.42.4 ../pom.xml diff --git a/modules/agent-transport/agent-transport-http/pom.xml b/modules/agent-transport/agent-transport-http/pom.xml index 87f4adbc2..06555647b 100644 --- a/modules/agent-transport/agent-transport-http/pom.xml +++ b/modules/agent-transport/agent-transport-http/pom.xml @@ -30,7 +30,7 @@ org.dromara.jpom.agent-transport jpom-agent-transport-parent - 2.10.41 + 2.10.42.4 ../pom.xml diff --git a/modules/agent-transport/pom.xml b/modules/agent-transport/pom.xml index 5e5b243a2..6ae9f85e1 100644 --- a/modules/agent-transport/pom.xml +++ b/modules/agent-transport/pom.xml @@ -29,7 +29,7 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml pom @@ -38,7 +38,7 @@ agent-transport-http 4.0.0 - 2.10.41 + 2.10.42.4 org.dromara.jpom.agent-transport jpom-agent-transport-parent Jpom Agent Transport diff --git a/modules/agent/Dockerfile b/modules/agent/Dockerfile index b04f3a6ce..0989edc72 100644 --- a/modules/agent/Dockerfile +++ b/modules/agent/Dockerfile @@ -30,7 +30,7 @@ VOLUME ["/root/.m2"] ARG TEMP_VERSION="" ARG JPOM_VERSION ENV USE_JPOM_VERSION=${JPOM_VERSION}${TEMP_VERSION} -RUN --mount=type=cache,target=/root/.m2 sh ./script/replaceVersion.sh ${USE_JPOM_VERSION} +RUN --mount=type=cache,target=/root/.m2 sh ./script/replaceVersion.sh ${USE_JPOM_VERSION} "release" RUN --mount=type=cache,target=/root/.m2 mvn -B -e -T 1C clean package -pl modules/agent -am -Dmaven.test.skip=true -Dmaven.compile.fork=true -s script/settings.xml diff --git a/modules/agent/pom.xml b/modules/agent/pom.xml index 60971ba39..5b7285511 100644 --- a/modules/agent/pom.xml +++ b/modules/agent/pom.xml @@ -29,12 +29,12 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml 4.0.0 agent - 2.10.41 + 2.10.42.4 Jpom Agent org.dromara.jpom.JpomAgentApplication @@ -81,11 +81,6 @@ ${project.version} - - cn.hutool - hutool-json - - diff --git a/modules/agent/src/main/java/org/dromara/jpom/common/interceptor/AuthorizeInterceptor.java b/modules/agent/src/main/java/org/dromara/jpom/common/interceptor/AuthorizeInterceptor.java index 76198b177..5e2b262f8 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/common/interceptor/AuthorizeInterceptor.java +++ b/modules/agent/src/main/java/org/dromara/jpom/common/interceptor/AuthorizeInterceptor.java @@ -24,8 +24,8 @@ package org.dromara.jpom.common.interceptor; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.system.AgentAuthorize; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/IndexController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/IndexController.java index aeae3f825..5ed325174 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/IndexController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/IndexController.java @@ -26,11 +26,12 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import cn.hutool.system.SystemUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; import org.dromara.jpom.common.JpomManifest; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.RemoteVersion; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.common.commander.AbstractSystemCommander; @@ -78,7 +79,7 @@ public class IndexController extends BaseAgentController { } @RequestMapping(value = "info", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage info() { + public IJsonMessage info() { JpomManifest instance = JpomManifest.getInstance(); cn.keepbx.jpom.RemoteVersion remoteVersion = RemoteVersion.cacheInfo(); @@ -97,7 +98,7 @@ public class IndexController extends BaseAgentController { * @return json */ @PostMapping(value = "get-stat-info", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getDirectTop() { + public IJsonMessage getDirectTop() { JSONObject jsonObject = new JSONObject(); JSONObject topInfo = OshiUtils.getSimpleInfo(); jsonObject.put("simpleStatus", topInfo); @@ -132,7 +133,7 @@ public class IndexController extends BaseAgentController { @RequestMapping(value = "processList", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> getProcessList(String processName, Integer count) { + public IJsonMessage> getProcessList(String processName, Integer count) { processName = StrUtil.emptyToDefault(processName, "java"); List processes = OshiUtils.getProcesses(processName, Convert.toInt(count, 20)); processes = processes.stream() @@ -148,7 +149,7 @@ public class IndexController extends BaseAgentController { @PostMapping(value = "kill.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage kill(int pid) { + public IJsonMessage kill(int pid) { long jpomAgentId = JpomManifest.getInstance().getPid(); Assert.state(!StrUtil.equals(StrUtil.toString(jpomAgentId), StrUtil.toString(pid)), "不支持在线关闭 Agent 进程"); String result = AbstractSystemCommander.getInstance().kill(null, pid); @@ -159,19 +160,19 @@ public class IndexController extends BaseAgentController { } @PostMapping(value = "disk-info", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> diskInfo() { + public IJsonMessage> diskInfo() { List list = OshiUtils.fileStores(); return JsonMessage.success("", list); } @PostMapping(value = "hw-disk--info", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> hwDiskInfo() { + public IJsonMessage> hwDiskInfo() { List list = OshiUtils.diskStores(); return JsonMessage.success("", list); } @PostMapping(value = "network-interfaces", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> networkInterfaces() { + public IJsonMessage> networkInterfaces() { List list = OshiUtils.networkInterfaces(); return JsonMessage.success("", list); } diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/FileManageController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/FileManageController.java index da058d47a..40864f33a 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/FileManageController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/FileManageController.java @@ -24,9 +24,10 @@ package org.dromara.jpom.controller.manage; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.CommandOpResult; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.system.AgentConfig; @@ -55,18 +56,18 @@ public class FileManageController extends BaseAgentController { } @RequestMapping(value = "upload-sharding", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage uploadSharding(MultipartFile file, - String sliceId, - Integer totalSlice, - Integer nowSlice, - String fileSumMd5) throws Exception { + public IJsonMessage uploadSharding(MultipartFile file, + String sliceId, + Integer totalSlice, + Integer nowSlice, + String fileSumMd5) throws Exception { String tempPathName = agentConfig.getFixedTempPathName(); this.uploadSharding(file, tempPathName, sliceId, totalSlice, nowSlice, fileSumMd5); return JsonMessage.success("上传成功"); } @RequestMapping(value = "sharding-merge", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage shardingMerge(String type, + public IJsonMessage shardingMerge(String type, @ValidatorItem String path, Integer stripComponents, String sliceId, diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ManageEditProjectController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ManageEditProjectController.java index 7ccff8e56..2dd1a8421 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ManageEditProjectController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ManageEditProjectController.java @@ -30,10 +30,11 @@ import cn.hutool.core.lang.RegexPool; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.model.RunMode; import org.dromara.jpom.model.data.DslYmlDto; @@ -162,7 +163,7 @@ public class ManageEditProjectController extends BaseAgentController { @RequestMapping(value = "saveProject", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage saveProject(NodeProjectInfoModel projectInfo) { + public IJsonMessage saveProject(NodeProjectInfoModel projectInfo) { // 预检查数据 String strPreviewData = getParameter("previewData"); boolean previewData = Convert.toBool(strPreviewData, false); @@ -218,7 +219,7 @@ public class ManageEditProjectController extends BaseAgentController { * @param previewData 是否是预检查 * @return 错误信息 */ - private JsonMessage save(NodeProjectInfoModel projectInfo, NodeProjectInfoModel exits, boolean previewData) { + private IJsonMessage save(NodeProjectInfoModel projectInfo, NodeProjectInfoModel exits, boolean previewData) { projectInfo.setWorkspaceId(getWorkspaceId()); this.checkPath(projectInfo); @@ -356,7 +357,7 @@ public class ManageEditProjectController extends BaseAgentController { * @return json */ @RequestMapping(value = "deleteProject", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage deleteProject(String copyId, String thorough) { + public IJsonMessage deleteProject(String copyId, String thorough) { NodeProjectInfoModel nodeProjectInfoModel = tryGetProjectInfoModel(); if (nodeProjectInfoModel == null) { // 返回正常 200 状态码,考虑节点分发重复操作 @@ -420,7 +421,7 @@ public class ManageEditProjectController extends BaseAgentController { } @RequestMapping(value = "releaseOutGiving", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage releaseOutGiving() { + public IJsonMessage releaseOutGiving() { NodeProjectInfoModel nodeProjectInfoModel = tryGetProjectInfoModel(); if (nodeProjectInfoModel != null) { nodeProjectInfoModel.setOutGivingProject(false); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileBackupController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileBackupController.java index 25af7bf63..25c014dc7 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileBackupController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileBackupController.java @@ -27,10 +27,11 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.data.NodeProjectInfoModel; import org.dromara.jpom.script.ProjectFileBackupUtil; @@ -69,7 +70,7 @@ public class ProjectFileBackupController extends BaseAgentController { * @return list */ @RequestMapping(value = "list-backup", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage listBackup(String id) { + public IJsonMessage listBackup(String id) { // NodeProjectInfoModel projectInfoModel = super.getProjectInfoModel(id); // 合并 @@ -100,7 +101,7 @@ public class ProjectFileBackupController extends BaseAgentController { * @return list */ @RequestMapping(value = "backup-item-files", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> backupItemFiles(String id, String path, @ValidatorItem String backupId) { + public IJsonMessage> backupItemFiles(String id, String path, @ValidatorItem String backupId) { // 查询项目路径 NodeProjectInfoModel projectInfoModel = super.getProjectInfoModel(); File lib = ProjectFileBackupUtil.pathProjectBackup(projectInfoModel, backupId); @@ -149,7 +150,7 @@ public class ProjectFileBackupController extends BaseAgentController { * @return msg */ @RequestMapping(value = "backup-delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage deleteFile(String id, @ValidatorItem String backupId, @ValidatorItem String filename, String levelName) { + public IJsonMessage deleteFile(String id, @ValidatorItem String backupId, @ValidatorItem String filename, String levelName) { NodeProjectInfoModel projectInfoModel = super.getProjectInfoModel(); File lib = ProjectFileBackupUtil.pathProjectBackup(projectInfoModel, backupId); File file = FileUtil.file(lib, StrUtil.emptyToDefault(levelName, FileUtil.FILE_SEPARATOR), filename); @@ -168,7 +169,7 @@ public class ProjectFileBackupController extends BaseAgentController { * @return msg */ @RequestMapping(value = "backup-recover", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage recoverFile(String id, @ValidatorItem String backupId, String type, String filename, String levelName) { + public IJsonMessage recoverFile(String id, @ValidatorItem String backupId, String type, String filename, String levelName) { NodeProjectInfoModel projectInfoModel = super.getProjectInfoModel(); File backupPath = ProjectFileBackupUtil.pathProjectBackup(projectInfoModel, backupId); String projectPath = projectInfoModel.allLib(); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileControl.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileControl.java index 997f9b80e..1206380e9 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileControl.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectFileControl.java @@ -33,11 +33,12 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.common.commander.CommandOpResult; import org.dromara.jpom.common.validator.ValidatorItem; @@ -94,7 +95,7 @@ public class ProjectFileControl extends BaseAgentController { } @RequestMapping(value = "getFileList", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> getFileList(String id, String path) { + public IJsonMessage> getFileList(String id, String path) { // 查询项目路径 NodeProjectInfoModel pim = projectInfoService.getItem(id); Assert.notNull(pim, "查询失败:项目不存在"); @@ -125,7 +126,7 @@ public class ProjectFileControl extends BaseAgentController { * @return json */ @PostMapping(value = "diff_file", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage diffFile(@RequestBody DiffFileVo diffFileVo) { + public IJsonMessage diffFile(@RequestBody DiffFileVo diffFileVo) { String id = diffFileVo.getId(); NodeProjectInfoModel projectInfoModel = super.getProjectInfoModel(id); // @@ -215,7 +216,7 @@ public class ProjectFileControl extends BaseAgentController { } @RequestMapping(value = "upload-sharding", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage uploadSharding(MultipartFile file, + public IJsonMessage uploadSharding(MultipartFile file, String sliceId, Integer totalSlice, Integer nowSlice, @@ -227,7 +228,7 @@ public class ProjectFileControl extends BaseAgentController { } @RequestMapping(value = "sharding-merge", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage shardingMerge(String type, + public IJsonMessage shardingMerge(String type, String levelName, Integer stripComponents, String sliceId, @@ -251,7 +252,7 @@ public class ProjectFileControl extends BaseAgentController { * @return 结果 * @throws Exception 异常 */ - private JsonMessage upload(File file, String type, String levelName, Integer stripComponents, String after) throws Exception { + private IJsonMessage upload(File file, String type, String levelName, Integer stripComponents, String after) throws Exception { NodeProjectInfoModel pim = getProjectInfoModel(); File lib = StrUtil.isEmpty(levelName) ? new File(pim.allLib()) : FileUtil.file(pim.allLib(), levelName); // 备份文件 @@ -346,7 +347,7 @@ public class ProjectFileControl extends BaseAgentController { } @RequestMapping(value = "deleteFile", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage deleteFile(String filename, String type, String levelName) { + public IJsonMessage deleteFile(String filename, String type, String levelName) { NodeProjectInfoModel pim = getProjectInfoModel(); File file = FileUtil.file(pim.allLib(), StrUtil.emptyToDefault(levelName, StrUtil.SLASH)); // 备份文件 @@ -380,7 +381,7 @@ public class ProjectFileControl extends BaseAgentController { @RequestMapping(value = "batch_delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage batchDelete(@RequestBody DiffFileVo diffFileVo) { + public IJsonMessage batchDelete(@RequestBody DiffFileVo diffFileVo) { String id = diffFileVo.getId(); String dir = diffFileVo.getDir(); NodeProjectInfoModel projectInfoModel = super.getProjectInfoModel(id); @@ -414,7 +415,7 @@ public class ProjectFileControl extends BaseAgentController { * @return json */ @PostMapping(value = "read_file", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage readFile(String filePath, String filename) { + public IJsonMessage readFile(String filePath, String filename) { NodeProjectInfoModel pim = getProjectInfoModel(); filePath = StrUtil.emptyToDefault(filePath, File.separator); // 判断文件后缀 @@ -434,7 +435,7 @@ public class ProjectFileControl extends BaseAgentController { * @return json */ @PostMapping(value = "update_config_file", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage updateConfigFile(String filePath, String filename, String fileText) { + public IJsonMessage updateConfigFile(String filePath, String filename, String fileText) { NodeProjectInfoModel pim = getProjectInfoModel(); filePath = StrUtil.emptyToDefault(filePath, File.separator); // 判断文件后缀 @@ -492,7 +493,7 @@ public class ProjectFileControl extends BaseAgentController { * @return json */ @PostMapping(value = "remote_download", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage remoteDownload(String id, String url, String levelName, String unzip, Integer stripComponents) { + public IJsonMessage remoteDownload(String id, String url, String levelName, String unzip, Integer stripComponents) { Assert.hasText(url, "请输入正确的远程地址"); @@ -542,7 +543,7 @@ public class ProjectFileControl extends BaseAgentController { * @return json */ @PostMapping(value = "new_file_folder.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage newFileFolder(String id, String levelName, @ValidatorItem String filename, String unFolder) { + public IJsonMessage newFileFolder(String id, String levelName, @ValidatorItem String filename, String unFolder) { NodeProjectInfoModel projectInfoModel = projectInfoService.getItem(id); Assert.notNull(projectInfoModel, "没有对应到项目"); File file = FileUtil.file(projectInfoModel.allLib(), StrUtil.emptyToDefault(levelName, FileUtil.FILE_SEPARATOR), filename); @@ -569,7 +570,7 @@ public class ProjectFileControl extends BaseAgentController { * @return json */ @PostMapping(value = "rename.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage rename(String id, String levelName, @ValidatorItem String filename, String newname) { + public IJsonMessage rename(String id, String levelName, @ValidatorItem String filename, String newname) { NodeProjectInfoModel projectInfoModel = getProjectInfoModel(); File file = FileUtil.file(projectInfoModel.allLib(), StrUtil.emptyToDefault(levelName, FileUtil.FILE_SEPARATOR), filename); File newFile = FileUtil.file(projectInfoModel.allLib(), StrUtil.emptyToDefault(levelName, FileUtil.FILE_SEPARATOR), newname); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectListController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectListController.java index a0e0cbd17..be4412c25 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectListController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectListController.java @@ -23,9 +23,10 @@ package org.dromara.jpom.controller.manage; import cn.hutool.core.io.FileUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.model.RunMode; import org.dromara.jpom.model.data.NodeProjectInfoModel; @@ -57,7 +58,7 @@ public class ProjectListController extends BaseAgentController { * @see NodeProjectInfoModel */ @RequestMapping(value = "getProjectItem", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectItem(String id) { + public IJsonMessage getProjectItem(String id) { NodeProjectInfoModel nodeProjectInfoModel = projectInfoService.getItem(id); if (nodeProjectInfoModel != null) { RunMode runMode = nodeProjectInfoModel.getRunMode(); @@ -88,7 +89,7 @@ public class ProjectListController extends BaseAgentController { * @return json */ @RequestMapping(value = "getProjectInfo", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> getProjectInfo() { + public IJsonMessage> getProjectInfo() { try { // 查询数据 List nodeProjectInfoModels = projectInfoService.list(); @@ -103,7 +104,7 @@ public class ProjectListController extends BaseAgentController { * 展示项目页面 */ @RequestMapping(value = "project_copy_list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> projectCopyList(String id) { + public IJsonMessage> projectCopyList(String id) { NodeProjectInfoModel nodeProjectInfoModel = projectInfoService.getItem(id); Assert.notNull(nodeProjectInfoModel, "没有对应项目"); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectStatusController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectStatusController.java index ff65b21e3..29bf7582b 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectStatusController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/ProjectStatusController.java @@ -23,11 +23,12 @@ package org.dromara.jpom.controller.manage; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.common.commander.CommandOpResult; import org.dromara.jpom.common.validator.ValidatorItem; @@ -68,7 +69,7 @@ public class ProjectStatusController extends BaseAgentController { * @return json */ @RequestMapping(value = "getProjectStatus", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectStatus(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String getCopy) { + public IJsonMessage getProjectStatus(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String getCopy) { NodeProjectInfoModel nodeProjectInfoModel = tryGetProjectInfoModel(); Assert.notNull(nodeProjectInfoModel, "项目id不存在"); JSONObject jsonObject = new JSONObject(); @@ -110,7 +111,7 @@ public class ProjectStatusController extends BaseAgentController { * @return obj */ @RequestMapping(value = "getProjectPort", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectPort(String ids) { + public IJsonMessage getProjectPort(String ids) { Assert.hasText(ids, "没有要获取的信息"); JSONArray jsonArray = JSONArray.parseArray(ids); JSONObject jsonObject = new JSONObject(); @@ -155,7 +156,7 @@ public class ProjectStatusController extends BaseAgentController { * @return obj */ @RequestMapping(value = "getProjectCopyPort", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectPort(String id, String copyIds) { + public IJsonMessage getProjectPort(String id, String copyIds) { if (StrUtil.isEmpty(copyIds) || StrUtil.isEmpty(id)) { return new JsonMessage<>(400, "参数异常"); } @@ -195,7 +196,7 @@ public class ProjectStatusController extends BaseAgentController { } @RequestMapping(value = "restart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage restart(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String copyId) { + public IJsonMessage restart(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String copyId) { NodeProjectInfoModel item = projectInfoService.getItem(id); Assert.notNull(item, "没有找到对应的项目"); NodeProjectInfoModel.JavaCopyItem copyItem = item.findCopyItem(copyId); @@ -213,7 +214,7 @@ public class ProjectStatusController extends BaseAgentController { @RequestMapping(value = "stop", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage stop(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String copyId) { + public IJsonMessage stop(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String copyId) { NodeProjectInfoModel item = projectInfoService.getItem(id); Assert.notNull(item, "没有找到对应的项目"); NodeProjectInfoModel.JavaCopyItem copyItem = item.findCopyItem(copyId); @@ -229,7 +230,7 @@ public class ProjectStatusController extends BaseAgentController { @RequestMapping(value = "start", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage start(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String copyId) { + public IJsonMessage start(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "项目id 不正确") String id, String copyId) { NodeProjectInfoModel item = projectInfoService.getItem(id); Assert.notNull(item, "没有找到对应的项目"); NodeProjectInfoModel.JavaCopyItem copyItem = item.findCopyItem(copyId); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/log/LogBackController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/log/LogBackController.java index 25cd8a243..8805e719c 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/manage/log/LogBackController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/manage/log/LogBackController.java @@ -24,10 +24,11 @@ package org.dromara.jpom.controller.manage.log; import cn.hutool.core.io.FileUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.model.data.NodeProjectInfoModel; import org.dromara.jpom.util.FileUtils; @@ -52,7 +53,7 @@ import java.util.List; public class LogBackController extends BaseAgentController { @RequestMapping(value = "logSize", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage logSize(String id, String copyId) { + public IJsonMessage logSize(String id, String copyId) { NodeProjectInfoModel nodeProjectInfoModel = getProjectInfoModel(); JSONObject jsonObject = new JSONObject(); // @@ -67,7 +68,7 @@ public class LogBackController extends BaseAgentController { } @RequestMapping(value = "resetLog", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage resetLog(String copyId) { + public IJsonMessage resetLog(String copyId) { NodeProjectInfoModel pim = getProjectInfoModel(); NodeProjectInfoModel.JavaCopyItem copyItem = pim.findCopyItem(copyId); try { @@ -83,7 +84,7 @@ public class LogBackController extends BaseAgentController { } @RequestMapping(value = "logBack_delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage clear(String name, String copyId) { + public IJsonMessage clear(String name, String copyId) { Assert.hasText(name, "没有对应到文件"); NodeProjectInfoModel pim = getProjectInfoModel(); NodeProjectInfoModel.JavaCopyItem copyItem = pim.findCopyItem(copyId); @@ -120,7 +121,7 @@ public class LogBackController extends BaseAgentController { } @RequestMapping(value = "logBack", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage console(String copyId) { + public IJsonMessage console(String copyId) { // 查询项目路径 NodeProjectInfoModel pim = getProjectInfoModel(); NodeProjectInfoModel.JavaCopyItem copyItem = pim.findCopyItem(copyId); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/script/ScriptController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/script/ScriptController.java index 400d444aa..9f403ebc6 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/script/ScriptController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/script/ScriptController.java @@ -28,11 +28,12 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Opt; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseAgentController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.data.NodeScriptExecLogModel; @@ -76,17 +77,17 @@ public class ScriptController extends BaseAgentController { } @RequestMapping(value = "list.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> list() { + public IJsonMessage> list() { return JsonMessage.success("", nodeScriptServer.list()); } @RequestMapping(value = "item.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage item(String id) { + public IJsonMessage item(String id) { return JsonMessage.success("", nodeScriptServer.getItem(id)); } @RequestMapping(value = "save.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage save(NodeScriptModel nodeScriptModel, String type, String global, String nodeId) { + public IJsonMessage save(NodeScriptModel nodeScriptModel, String type, String global, String nodeId) { Assert.notNull(nodeScriptModel, "没有数据"); Assert.hasText(nodeScriptModel.getContext(), "内容为空"); // @@ -141,7 +142,7 @@ public class ScriptController extends BaseAgentController { } @RequestMapping(value = "del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage del(String id) { + public IJsonMessage del(String id) { nodeScriptServer.deleteItem(id); return JsonMessage.success("删除成功"); } @@ -155,7 +156,7 @@ public class ScriptController extends BaseAgentController { * @return json */ @RequestMapping(value = "log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getNowLog(@ValidatorItem() String id, + public IJsonMessage getNowLog(@ValidatorItem() String id, @ValidatorItem() String executeId, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line) { NodeScriptModel item = nodeScriptServer.getItem(id); @@ -177,7 +178,7 @@ public class ScriptController extends BaseAgentController { * @return json */ @RequestMapping(value = "del_log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage delLog(@ValidatorItem() String id, + public IJsonMessage delLog(@ValidatorItem() String id, @ValidatorItem() String executeId) { NodeScriptModel item = nodeScriptServer.getItem(id); if (item == null) { @@ -199,7 +200,7 @@ public class ScriptController extends BaseAgentController { * @return json */ @RequestMapping(value = "exec", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage exec(@ValidatorItem() String id, String args, String params) { + public IJsonMessage exec(@ValidatorItem() String id, String args, String params) { NodeScriptModel item = nodeScriptServer.getItem(id); Assert.notNull(item, "对应脚本已经不存在啦"); String nowUserName = getNowUserName(); @@ -229,7 +230,7 @@ public class ScriptController extends BaseAgentController { * @return json */ @RequestMapping(value = "pull_exec_log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> pullExecLog(@ValidatorItem int pullCount) { + public IJsonMessage> pullExecLog(@ValidatorItem int pullCount) { Assert.state(pullCount > 0, "pull count error"); List list = nodeScriptExecLogServer.list(); list = CollUtil.sub(list, 0, pullCount); @@ -246,7 +247,7 @@ public class ScriptController extends BaseAgentController { * @return json */ @RequestMapping(value = "del_exec_log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage delExecLog(@RequestBody JSONObject jsonObject) { + public IJsonMessage delExecLog(@RequestBody JSONObject jsonObject) { JSONArray ids = jsonObject.getJSONArray("ids"); if (ids != null) { for (Object id : ids) { diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentCacheManageController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentCacheManageController.java index 2ae678db8..91f619fc1 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentCacheManageController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentCacheManageController.java @@ -24,12 +24,13 @@ package org.dromara.jpom.controller.system; import cn.hutool.core.date.DateTime; import cn.hutool.core.io.FileUtil; +import cn.keepbx.jpom.IJsonMessage; import cn.keepbx.jpom.event.ICacheTask; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.BaseAgentController; import org.dromara.jpom.common.JpomManifest; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractProjectCommander; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; @@ -79,7 +80,7 @@ public class AgentCacheManageController extends BaseAgentController implements I * @return json */ @PostMapping(value = "cache", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage cache() { + public IJsonMessage cache() { JSONObject jsonObject = new JSONObject(); // jsonObject.put("fileSize", this.tempFileSize); @@ -112,7 +113,7 @@ public class AgentCacheManageController extends BaseAgentController implements I * @return json */ @RequestMapping(value = "clearCache", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage clearCache(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "类型错误") String type) { + public IJsonMessage clearCache(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "类型错误") String type) { switch (type) { case "pidPort": AbstractProjectCommander.PID_PORT.clear(); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentWorkspaceEnvVarController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentWorkspaceEnvVarController.java index 1efda372e..6626320e1 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentWorkspaceEnvVarController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/AgentWorkspaceEnvVarController.java @@ -23,8 +23,9 @@ package org.dromara.jpom.controller.system; import cn.hutool.core.map.MapUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.system.WorkspaceEnvVarModel; import org.dromara.jpom.service.system.AgentWorkspaceEnvVarService; @@ -56,10 +57,10 @@ public class AgentWorkspaceEnvVarController extends BaseAgentController { * @return json */ @PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage updateWorkspaceEnvVar(@ValidatorItem String name, - @ValidatorItem String value, - @ValidatorItem String description, - Integer privacy) { + public IJsonMessage updateWorkspaceEnvVar(@ValidatorItem String name, + @ValidatorItem String value, + @ValidatorItem String description, + Integer privacy) { String workspaceId = getWorkspaceId(); synchronized (AgentWorkspaceEnvVarController.class) { WorkspaceEnvVarModel.WorkspaceEnvVarItemModel workspaceEnvVarModel = new WorkspaceEnvVarModel.WorkspaceEnvVarItemModel(); @@ -91,7 +92,7 @@ public class AgentWorkspaceEnvVarController extends BaseAgentController { * @return json */ @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage delete(@ValidatorItem String name) { + public IJsonMessage delete(@ValidatorItem String name) { String workspaceId = getWorkspaceId(); synchronized (AgentWorkspaceEnvVarController.class) { // diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/CertificateController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/CertificateController.java index dd712808a..edc435ac5 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/CertificateController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/CertificateController.java @@ -25,9 +25,10 @@ package org.dromara.jpom.controller.system; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.data.CertModel; import org.dromara.jpom.service.system.CertService; @@ -65,7 +66,7 @@ public class CertificateController extends BaseAgentController { * @return json */ @RequestMapping(value = "/getCertList", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> getCertList() { + public IJsonMessage> getCertList() { List array = certService.list(); return JsonMessage.success("", array); } @@ -77,7 +78,7 @@ public class CertificateController extends BaseAgentController { * @return json */ @RequestMapping(value = "/delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage delete(@ValidatorItem String id) { + public IJsonMessage delete(@ValidatorItem String id) { certService.deleteItem(id); return JsonMessage.success("删除成功"); } diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/LogManageController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/LogManageController.java index df02cc320..ef579d463 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/LogManageController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/LogManageController.java @@ -24,9 +24,10 @@ package org.dromara.jpom.controller.system; import cn.hutool.core.io.FileUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.socket.AgentFileTailWatcher; @@ -56,7 +57,7 @@ public class LogManageController extends BaseAgentController { @RequestMapping(value = "log_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> logData() { + public IJsonMessage> logData() { List data = DirTreeUtil.getTreeData(LogbackConfig.getPath()); return JsonMessage.success("", data); } @@ -64,7 +65,7 @@ public class LogManageController extends BaseAgentController { @RequestMapping(value = "log_del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public JsonMessage logData(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "path错误") String path) { + public IJsonMessage logData(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "path错误") String path) { File file = FileUtil.file(LogbackConfig.getPath(), path); // 判断修改时间 long modified = file.lastModified(); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/NginxController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/NginxController.java index 782822edc..d7efc95f6 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/NginxController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/NginxController.java @@ -28,6 +28,8 @@ import cn.hutool.core.text.StrSplitter; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.system.SystemUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.github.odiszapc.nginxparser.NgxBlock; @@ -36,7 +38,6 @@ import com.github.odiszapc.nginxparser.NgxEntry; import com.github.odiszapc.nginxparser.NgxParam; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseAgentController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.AbstractSystemCommander; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; @@ -84,7 +85,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "list_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> list(String whitePath, String name, String showAll) { + public IJsonMessage> list(String whitePath, String name, String showAll) { boolean checkNgxDirectory = whitelistDirectoryService.checkNgxDirectory(whitePath); Assert.state(checkNgxDirectory, "文件路径错误,非白名单路径"); if (StrUtil.isEmpty(name)) { @@ -98,7 +99,7 @@ public class NginxController extends BaseAgentController { * nginx列表 */ @RequestMapping(value = "tree.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage tree() { + public IJsonMessage tree() { JSONArray array = nginxService.tree(); return JsonMessage.success("", array); } @@ -111,7 +112,7 @@ public class NginxController extends BaseAgentController { * @return 页面 */ @RequestMapping(value = "item_data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage itemData(String path, String name) { + public IJsonMessage itemData(String path, String name) { boolean ngxDirectory = whitelistDirectoryService.checkNgxDirectory(path); Assert.state(ngxDirectory, "文件路径错误,非白名单路径"); String realPath = AgentWhitelist.convertRealPath(path); @@ -142,7 +143,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "updateNgx", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage updateNgx(String name, String whitePath, String genre, @ValidatorItem(msg = "请填写配置信息") String context) { + public IJsonMessage updateNgx(String name, String whitePath, String genre, @ValidatorItem(msg = "请填写配置信息") String context) { this.checkName(name); // boolean ngxDirectory = whitelistDirectoryService.checkNgxDirectory(whitePath); @@ -243,7 +244,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage delete(String path, String name, String type, String from) { + public IJsonMessage delete(String path, String name, String type, String from) { if (!whitelistDirectoryService.checkNgxDirectory(path)) { return new JsonMessage<>(400, "非法操作"); } @@ -284,7 +285,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "status", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage status() { + public IJsonMessage status() { String name = nginxService.getServiceName(); if (StrUtil.isEmpty(name)) { return new JsonMessage<>(500, "服务名错误"); @@ -303,7 +304,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "updateConf", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage updateConf(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "服务名称错误") String name) { + public IJsonMessage updateConf(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "服务名称错误") String name) { JSONObject ngxConf = nginxService.getNgxConf(); ngxConf.put("name", name); nginxService.save(ngxConf); @@ -316,7 +317,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "config", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage config() { + public IJsonMessage config() { JSONObject ngxConf = nginxService.getNgxConf(); return JsonMessage.success("", ngxConf); } @@ -327,7 +328,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "open", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage open() { + public IJsonMessage open() { String name = nginxService.getServiceName(); String result = AbstractSystemCommander.getInstance().startService(name); return JsonMessage.success("nginx服务已启动 " + result); @@ -339,7 +340,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "close", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage close() { + public IJsonMessage close() { String name = nginxService.getServiceName(); String result = AbstractSystemCommander.getInstance().stopService(name); return JsonMessage.success("nginx服务已停止 " + result); @@ -391,7 +392,7 @@ public class NginxController extends BaseAgentController { * @return json */ @RequestMapping(value = "reload", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage reload() { + public IJsonMessage reload() { String checkResult = this.checkNginx(); if (StrUtil.isNotEmpty(checkResult) && !StrUtil.containsIgnoreCase(checkResult, "successful")) { return new JsonMessage<>(400, checkResult); diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java index 47e147642..dd62c3f51 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java @@ -26,12 +26,13 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.BaseAgentController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.system.ExtConfigBean; import org.springframework.boot.env.YamlPropertySourceLoader; @@ -58,7 +59,7 @@ import java.nio.charset.StandardCharsets; public class SystemConfigController extends BaseAgentController { @RequestMapping(value = "getConfig.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage config() throws IOException { + public IJsonMessage config() throws IOException { Resource resource = ExtConfigBean.getResource(); String content = IoUtil.read(resource.getInputStream(), CharsetUtil.CHARSET_UTF_8); JSONObject json = new JSONObject(); @@ -68,7 +69,7 @@ public class SystemConfigController extends BaseAgentController { } @RequestMapping(value = "save_config.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage saveConfig(@ValidatorItem(msg = "内容不能为空") String content, String restart) throws IOException { + public IJsonMessage saveConfig(@ValidatorItem(msg = "内容不能为空") String content, String restart) throws IOException { try { YamlPropertySourceLoader yamlPropertySourceLoader = new YamlPropertySourceLoader(); // @author hjk 前端编辑器允许使用tab键,并设定为2个空格,再转换为yml时要把tab键换成2个空格 diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java index 7d989eda6..e051fe4ce 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java @@ -29,9 +29,14 @@ import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; +import cn.keepbx.jpom.IJsonMessage; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.JpomApplication; -import org.dromara.jpom.common.*; +import org.dromara.jpom.common.BaseAgentController; +import org.dromara.jpom.common.Const; +import org.dromara.jpom.common.JpomManifest; +import org.dromara.jpom.common.RemoteVersion; import org.dromara.jpom.system.AgentConfig; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; @@ -65,10 +70,10 @@ public class SystemUpdateController extends BaseAgentController { } @PostMapping(value = "upload-jar-sharding", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage uploadJarSharding(MultipartFile file, String sliceId, - Integer totalSlice, - Integer nowSlice, - String fileSumMd5) throws IOException { + public IJsonMessage uploadJarSharding(MultipartFile file, String sliceId, + Integer totalSlice, + Integer nowSlice, + String fileSumMd5) throws IOException { // String tempPathName = agentConfig.getFixedTempPathName(); this.uploadSharding(file, tempPathName, sliceId, totalSlice, nowSlice, fileSumMd5, "jar", "zip"); @@ -76,7 +81,7 @@ public class SystemUpdateController extends BaseAgentController { } @PostMapping(value = "upload-jar-sharding-merge", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage uploadJarShardingMerge(String sliceId, + public IJsonMessage uploadJarShardingMerge(String sliceId, Integer totalSlice, String fileSumMd5) throws IOException { // @@ -102,7 +107,7 @@ public class SystemUpdateController extends BaseAgentController { } @PostMapping(value = "change_log", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage changeLog(String beta) { + public IJsonMessage changeLog(String beta) { // boolean betaBool = Convert.toBool(beta, false); boolean betaRelease = RemoteVersion.betaRelease(); @@ -122,7 +127,7 @@ public class SystemUpdateController extends BaseAgentController { * @see RemoteVersion */ @PostMapping(value = "check_version.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage checkVersion() { + public IJsonMessage checkVersion() { cn.keepbx.jpom.RemoteVersion remoteVersion = RemoteVersion.loadRemoteInfo(); return JsonMessage.success("", remoteVersion); } @@ -134,7 +139,7 @@ public class SystemUpdateController extends BaseAgentController { * @see RemoteVersion */ @PostMapping(value = "remote_upgrade.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage upgrade() throws IOException { + public IJsonMessage upgrade() throws IOException { RemoteVersion.upgrade(configBean.getTempPath().getAbsolutePath()); return JsonMessage.success(Const.UPGRADE_MSG); } diff --git a/modules/agent/src/main/java/org/dromara/jpom/controller/system/WhitelistDirectoryController.java b/modules/agent/src/main/java/org/dromara/jpom/controller/system/WhitelistDirectoryController.java index e770b3609..4d4fd1796 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/controller/system/WhitelistDirectoryController.java +++ b/modules/agent/src/main/java/org/dromara/jpom/controller/system/WhitelistDirectoryController.java @@ -27,8 +27,9 @@ import cn.hutool.core.lang.RegexPool; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseJpomController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.data.AgentWhitelist; import org.dromara.jpom.service.WhitelistDirectoryService; import org.dromara.jpom.system.AgentConfig; @@ -59,14 +60,14 @@ public class WhitelistDirectoryController extends BaseJpomController { } @RequestMapping(value = "whitelistDirectory_data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage whiteListDirectoryData() { + public IJsonMessage whiteListDirectoryData() { AgentWhitelist agentWhitelist = whitelistDirectoryService.getWhitelist(); return JsonMessage.success("", agentWhitelist); } @PostMapping(value = "whitelistDirectory_submit", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage whitelistDirectorySubmit(String project, String nginx, String nginxPath, + public IJsonMessage whitelistDirectorySubmit(String project, String nginx, String nginxPath, String allowEditSuffix, String allowRemoteDownloadHost) { List list = AgentWhitelist.parseToList(project, true, "项目路径白名单不能为空"); // diff --git a/modules/agent/src/main/java/org/dromara/jpom/model/data/DslYmlDto.java b/modules/agent/src/main/java/org/dromara/jpom/model/data/DslYmlDto.java index 2710c0425..e036f69ab 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/model/data/DslYmlDto.java +++ b/modules/agent/src/main/java/org/dromara/jpom/model/data/DslYmlDto.java @@ -25,9 +25,9 @@ package org.dromara.jpom.model.data; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.setting.yaml.YamlUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.jpom.model.BaseJsonModel; import org.springframework.util.Assert; import java.io.ByteArrayInputStream; diff --git a/modules/agent/src/main/java/org/dromara/jpom/model/data/NodeProjectInfoModel.java b/modules/agent/src/main/java/org/dromara/jpom/model/data/NodeProjectInfoModel.java index 31bd368d4..0b21c35f8 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/model/data/NodeProjectInfoModel.java +++ b/modules/agent/src/main/java/org/dromara/jpom/model/data/NodeProjectInfoModel.java @@ -27,9 +27,9 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.jpom.model.BaseJsonModel; import org.dromara.jpom.model.RunMode; import org.dromara.jpom.system.JpomRuntimeException; import org.springframework.util.Assert; diff --git a/modules/agent/src/main/java/org/dromara/jpom/model/system/NetstatModel.java b/modules/agent/src/main/java/org/dromara/jpom/model/system/NetstatModel.java index 011242b08..145efd094 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/model/system/NetstatModel.java +++ b/modules/agent/src/main/java/org/dromara/jpom/model/system/NetstatModel.java @@ -23,7 +23,7 @@ package org.dromara.jpom.model.system; import cn.hutool.core.util.StrUtil; -import org.dromara.jpom.model.BaseJsonModel; +import cn.keepbx.jpom.model.BaseJsonModel; /** * 网络端口信息实体 diff --git a/modules/agent/src/main/java/org/dromara/jpom/script/NodeScriptProcessBuilder.java b/modules/agent/src/main/java/org/dromara/jpom/script/NodeScriptProcessBuilder.java index 34ebde51a..026f87d21 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/script/NodeScriptProcessBuilder.java +++ b/modules/agent/src/main/java/org/dromara/jpom/script/NodeScriptProcessBuilder.java @@ -31,11 +31,11 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.EnvironmentMapBuilder; import org.dromara.jpom.model.data.NodeScriptModel; import org.dromara.jpom.service.system.AgentWorkspaceEnvVarService; diff --git a/modules/agent/src/main/java/org/dromara/jpom/service/script/NodeScriptServer.java b/modules/agent/src/main/java/org/dromara/jpom/service/script/NodeScriptServer.java index 68efd189f..64d2fb37b 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/service/script/NodeScriptServer.java +++ b/modules/agent/src/main/java/org/dromara/jpom/service/script/NodeScriptServer.java @@ -28,9 +28,9 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.task.Task; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.cron.ICron; import org.dromara.jpom.common.AgentConst; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.ICron; import org.dromara.jpom.model.data.NodeScriptExecLogModel; import org.dromara.jpom.model.data.NodeScriptModel; import org.dromara.jpom.script.NodeScriptProcessBuilder; diff --git a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentFreeWebSocketScriptHandle.java b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentFreeWebSocketScriptHandle.java index 693edcc2a..8a271c4de 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentFreeWebSocketScriptHandle.java +++ b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentFreeWebSocketScriptHandle.java @@ -28,12 +28,12 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.LineHandler; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.EnvironmentMapBuilder; import org.dromara.jpom.system.ExtConfigBean; import org.dromara.jpom.util.CommandUtil; diff --git a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketConsoleHandle.java b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketConsoleHandle.java index 9f3632e9f..d36ab24e0 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketConsoleHandle.java +++ b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketConsoleHandle.java @@ -27,10 +27,10 @@ import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.commander.CommandOpResult; import org.dromara.jpom.model.data.NodeProjectInfoModel; import org.dromara.jpom.service.manage.ConsoleService; diff --git a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketScriptHandle.java b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketScriptHandle.java index d6aca8595..98e0c8754 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketScriptHandle.java +++ b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketScriptHandle.java @@ -23,9 +23,9 @@ package org.dromara.jpom.socket; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.data.NodeScriptModel; import org.dromara.jpom.script.NodeScriptProcessBuilder; import org.dromara.jpom.service.script.NodeScriptServer; diff --git a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketTomcatHandle.java b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketTomcatHandle.java index 4549122eb..b18fe4934 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketTomcatHandle.java +++ b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketTomcatHandle.java @@ -24,10 +24,10 @@ package org.dromara.jpom.socket; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.io.FileUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.system.AgentConfig; import org.dromara.jpom.system.LogbackConfig; import org.dromara.jpom.util.SocketSessionUtil; diff --git a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketUpdateHandle.java b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketUpdateHandle.java index a0a8bf624..08786933c 100644 --- a/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketUpdateHandle.java +++ b/modules/agent/src/main/java/org/dromara/jpom/socket/AgentWebSocketUpdateHandle.java @@ -24,12 +24,12 @@ package org.dromara.jpom.socket; import cn.hutool.core.lang.Tuple; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.Const; import org.dromara.jpom.common.JpomManifest; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.AgentFileModel; import org.dromara.jpom.model.UploadFileModel; import org.dromara.jpom.model.WebSocketMessageModel; diff --git a/modules/common/pom.xml b/modules/common/pom.xml index e173e64a8..60ddbe23e 100644 --- a/modules/common/pom.xml +++ b/modules/common/pom.xml @@ -29,13 +29,13 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml 4.0.0 Jpom Common common - 2.10.41 + 2.10.42.4 @@ -89,13 +89,13 @@ org.apache.commons commons-compress - 1.22 + 1.23.0 cn.keepbx.jpom jpom-core-common - 1.0.1 + 1.0.5 diff --git a/modules/common/src/main/java/org/dromara/jpom/JpomApplication.java b/modules/common/src/main/java/org/dromara/jpom/JpomApplication.java index cf562b9a9..0c2a5a0c8 100644 --- a/modules/common/src/main/java/org/dromara/jpom/JpomApplication.java +++ b/modules/common/src/main/java/org/dromara/jpom/JpomApplication.java @@ -47,9 +47,7 @@ import org.springframework.context.annotation.Configuration; import java.io.File; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.function.Function; /** @@ -229,6 +227,12 @@ public class JpomApplication implements DisposableBean, InitializingBean { }); } + public static ScheduledExecutorService getScheduledExecutorService() { + return (ScheduledExecutorService) LINK_EXECUTOR_SERVICE.computeIfAbsent("jpom-system-task", + s -> Executors.newScheduledThreadPool(4, + r -> new Thread(r, "jpom-system-task"))); + } + /** * 注册线程池 * diff --git a/modules/common/src/main/java/org/dromara/jpom/common/BaseExceptionHandler.java b/modules/common/src/main/java/org/dromara/jpom/common/BaseExceptionHandler.java index 7b09baa3d..dfe7f2623 100644 --- a/modules/common/src/main/java/org/dromara/jpom/common/BaseExceptionHandler.java +++ b/modules/common/src/main/java/org/dromara/jpom/common/BaseExceptionHandler.java @@ -24,6 +24,8 @@ package org.dromara.jpom.common; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ValidateException; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.controller.BaseMyErrorController; import org.dromara.jpom.system.JpomRuntimeException; @@ -57,7 +59,7 @@ public abstract class BaseExceptionHandler { */ @ExceptionHandler({JpomRuntimeException.class, RuntimeException.class, Exception.class}) @ResponseBody - public JsonMessage defExceptionHandler(HttpServletRequest request, Exception e) { + public IJsonMessage defExceptionHandler(HttpServletRequest request, Exception e) { if (e instanceof JpomRuntimeException) { log.error("global handle exception: {} {}", request.getRequestURI(), e.getMessage(), e.getCause()); return new JsonMessage<>(500, e.getMessage()); @@ -73,7 +75,7 @@ public abstract class BaseExceptionHandler { @ExceptionHandler({NullPointerException.class}) @ResponseBody - public JsonMessage defNullPointerExceptionHandler(HttpServletRequest request, Exception e) { + public IJsonMessage defNullPointerExceptionHandler(HttpServletRequest request, Exception e) { log.error("global NullPointerException: {}", request.getRequestURI(), e); return new JsonMessage<>(500, "程序错误,空指针"); } @@ -86,7 +88,7 @@ public abstract class BaseExceptionHandler { */ @ExceptionHandler({IllegalArgumentException.class, IllegalStateException.class, ValidateException.class}) @ResponseBody - public JsonMessage paramExceptionHandler(HttpServletRequest request, Exception e) { + public IJsonMessage paramExceptionHandler(HttpServletRequest request, Exception e) { if (log.isDebugEnabled()) { log.debug("controller {}", request.getRequestURI(), e); } else { @@ -98,20 +100,20 @@ public abstract class BaseExceptionHandler { @ExceptionHandler({HttpMessageNotReadableException.class, HttpMessageConversionException.class}) @ResponseBody - public JsonMessage handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + public IJsonMessage handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { log.warn("参数解析异常:{}", e.getMessage()); return new JsonMessage<>(HttpStatus.EXPECTATION_FAILED.value(), "传入的参数格式不正确"); } @ExceptionHandler({HttpRequestMethodNotSupportedException.class, HttpMediaTypeNotSupportedException.class}) @ResponseBody - public JsonMessage handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { + public IJsonMessage handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { return new JsonMessage<>(HttpStatus.METHOD_NOT_ALLOWED.value(), "不被支持的请求方式", e.getMessage()); } @ExceptionHandler({NoHandlerFoundException.class}) @ResponseBody - public JsonMessage handleNoHandlerFoundException(NoHandlerFoundException e) { + public IJsonMessage handleNoHandlerFoundException(NoHandlerFoundException e) { return new JsonMessage<>(HttpStatus.NOT_FOUND.value(), "没有找到对应的资源", e.getMessage()); } @@ -122,21 +124,21 @@ public abstract class BaseExceptionHandler { */ @ExceptionHandler({MaxUploadSizeExceededException.class}) @ResponseBody - public JsonMessage handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { + public IJsonMessage handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { log.error("上传文件大小超出限制", e); return new JsonMessage<>(HttpStatus.NOT_ACCEPTABLE.value(), BaseMyErrorController.FILE_MAX_SIZE_MSG, e.getMessage()); } @ExceptionHandler({ConstructorException.class}) @ResponseBody - public JsonMessage handleConstructorException(ConstructorException e) { + public IJsonMessage handleConstructorException(ConstructorException e) { log.warn("yml 配置内容错误", e); return new JsonMessage<>(HttpStatus.EXPECTATION_FAILED.value(), "yml 配置内容格式有误请检查后重新操作(请检查是否有非法字段):" + e.getMessage()); } @ExceptionHandler({ScannerException.class}) @ResponseBody - public JsonMessage handleScannerException(ScannerException e) { + public IJsonMessage handleScannerException(ScannerException e) { log.warn("ScannerException", e); return new JsonMessage<>(HttpStatus.EXPECTATION_FAILED.value(), "yml 配置内容格式有误请检查后重新操作(不要使用 \\t(TAB) 缩进):" + e.getMessage()); } diff --git a/modules/common/src/main/java/org/dromara/jpom/common/BaseJpomController.java b/modules/common/src/main/java/org/dromara/jpom/common/BaseJpomController.java index 7b0fec163..4bf4816bc 100644 --- a/modules/common/src/main/java/org/dromara/jpom/common/BaseJpomController.java +++ b/modules/common/src/main/java/org/dromara/jpom/common/BaseJpomController.java @@ -350,4 +350,7 @@ public abstract class BaseJpomController { response.setContentType(contentType); } + protected String getWorkspaceId() { + return ServletUtil.getHeader(getRequest(), Const.WORKSPACE_ID_REQ_HEADER, CharsetUtil.CHARSET_UTF_8); + } } diff --git a/modules/common/src/main/java/org/dromara/jpom/common/JpomApplicationEvent.java b/modules/common/src/main/java/org/dromara/jpom/common/JpomApplicationEvent.java index e20df5595..0345960b3 100644 --- a/modules/common/src/main/java/org/dromara/jpom/common/JpomApplicationEvent.java +++ b/modules/common/src/main/java/org/dromara/jpom/common/JpomApplicationEvent.java @@ -35,6 +35,8 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.system.SystemUtil; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.cron.ICron; +import cn.keepbx.jpom.event.IAsyncLoad; import cn.keepbx.jpom.event.ICacheTask; import cn.keepbx.jpom.event.ISystemTask; import com.alibaba.fastjson2.JSONObject; @@ -48,8 +50,6 @@ import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.IAsyncLoad; -import org.dromara.jpom.cron.ICron; import org.dromara.jpom.system.ExtConfigBean; import org.dromara.jpom.util.JsonFileUtil; import org.springframework.beans.BeansException; diff --git a/modules/common/src/main/java/org/dromara/jpom/common/JpomManifest.java b/modules/common/src/main/java/org/dromara/jpom/common/JpomManifest.java index c5478aac6..f46ac2174 100644 --- a/modules/common/src/main/java/org/dromara/jpom/common/JpomManifest.java +++ b/modules/common/src/main/java/org/dromara/jpom/common/JpomManifest.java @@ -38,6 +38,7 @@ import cn.hutool.system.JavaInfo; import cn.hutool.system.OsInfo; import cn.hutool.system.SystemUtil; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; diff --git a/modules/common/src/main/java/org/dromara/jpom/common/JsonMessage.java b/modules/common/src/main/java/org/dromara/jpom/common/JsonMessage.java deleted file mode 100644 index 5c8d3805b..000000000 --- a/modules/common/src/main/java/org/dromara/jpom/common/JsonMessage.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Code Technology Studio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.dromara.jpom.common; - -import cn.hutool.core.util.StrUtil; -import cn.keepbx.jpom.BaseJsonMessage; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONFactory; -import com.alibaba.fastjson2.JSONObject; -import com.alibaba.fastjson2.JSONWriter; -import com.alibaba.fastjson2.writer.ObjectWriterImplToString; -import com.alibaba.fastjson2.writer.ObjectWriterProvider; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.math.BigInteger; - -/** - * 通用的json 数据格式 - * - * @author bwcx_jzy - * @since 2017/2/6. - * @since 1.0 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public class JsonMessage extends BaseJsonMessage { - - static { - ObjectWriterProvider writerProvider = JSONFactory.getDefaultObjectWriterProvider(); - // long 类型自动转String - writerProvider.register(Long.class, ObjectWriterImplToString.INSTANCE); - writerProvider.register(long.class, ObjectWriterImplToString.INSTANCE); - writerProvider.register(BigInteger.class, ObjectWriterImplToString.INSTANCE); - writerProvider.register(Long.TYPE, ObjectWriterImplToString.INSTANCE); - // - JSONFactory.setUseJacksonAnnotation(false); - // 枚举对象使用 枚举名称 - JSON.config(JSONWriter.Feature.WriteEnumsUsingName); - } - - - public JsonMessage(int code, String msg, T data) { - super(code, msg, data); - } - - public JsonMessage(int code, String msg) { - this(code, msg, null); - } - - /** - * 将data 转换为对应实体 - * - * @param tClass 类 - * @param 泛型 - * @return Object - */ - public E getData(Class tClass) { - return JSON.to(tClass, this.data); - } - - /** - * @return json - * @author bwcx_jzy - */ - @Override - public String toString() { - return JSONObject.toJSONString(this); - } - - public JSONObject toJson() { - return (JSONObject) JSON.toJSON(this); - } - - public static JSONObject toJson(int code, String msg) { - return toJson(code, msg, null); - } - - public static JSONObject toJson(int code, String msg, Object data) { - JsonMessage jsonMessage = new JsonMessage<>(code, msg, data); - return jsonMessage.toJson(); - } - - /** - * @param code code - * @param msg msg - * @return json - * @author bwcx_jzy - */ - public static String getString(int code, String msg) { - return getString(code, msg, null); - } - - public static JsonMessage success(String msg) { - return success(msg, (T) null); - } - - public static JsonMessage success(String template, Object... args) { - return success(StrUtil.format(template, args), (T) null); - } - - public static JsonMessage success(String msg, T data) { - return new JsonMessage<>(DEFAULT_SUCCESS_CODE, msg, data); - } - - /** - * @param code code - * @param msg msg - * @param data data - * @return json - * @author bwcx_jzy - */ - public static String getString(int code, String msg, Object data) { - return toJson(code, msg, data).toString(); - } -} diff --git a/modules/common/src/main/java/org/dromara/jpom/common/RemoteVersion.java b/modules/common/src/main/java/org/dromara/jpom/common/RemoteVersion.java index 85ccd2c33..8b2382d81 100644 --- a/modules/common/src/main/java/org/dromara/jpom/common/RemoteVersion.java +++ b/modules/common/src/main/java/org/dromara/jpom/common/RemoteVersion.java @@ -26,6 +26,7 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Tuple; import cn.hutool.http.HttpUtil; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/modules/common/src/main/java/org/dromara/jpom/common/validator/ParameterInterceptor.java b/modules/common/src/main/java/org/dromara/jpom/common/validator/ParameterInterceptor.java index a6eed243b..7f15e0a38 100644 --- a/modules/common/src/main/java/org/dromara/jpom/common/validator/ParameterInterceptor.java +++ b/modules/common/src/main/java/org/dromara/jpom/common/validator/ParameterInterceptor.java @@ -28,9 +28,9 @@ import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HtmlUtil; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseJpomController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.interceptor.HandlerMethodInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.core.MethodParameter; diff --git a/modules/common/src/main/java/org/dromara/jpom/controller/BaseMyErrorController.java b/modules/common/src/main/java/org/dromara/jpom/controller/BaseMyErrorController.java index 27195f70d..a916a2fd2 100644 --- a/modules/common/src/main/java/org/dromara/jpom/controller/BaseMyErrorController.java +++ b/modules/common/src/main/java/org/dromara/jpom/controller/BaseMyErrorController.java @@ -22,8 +22,8 @@ */ package org.dromara.jpom.controller; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController; import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.http.HttpStatus; diff --git a/modules/common/src/main/java/org/dromara/jpom/cron/IAsyncLoad.java b/modules/common/src/main/java/org/dromara/jpom/cron/IAsyncLoad.java deleted file mode 100644 index 7b0fb877d..000000000 --- a/modules/common/src/main/java/org/dromara/jpom/cron/IAsyncLoad.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Code Technology Studio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.dromara.jpom.cron; - -/** - * 异步 启动完成加载 - * - * @author bwcx_jzy - * @since 2022/1/26 - */ -public interface IAsyncLoad { - - /** - * 开始加载 - */ - void startLoad(); -} diff --git a/modules/common/src/main/java/org/dromara/jpom/cron/ICron.java b/modules/common/src/main/java/org/dromara/jpom/cron/ICron.java deleted file mode 100644 index 58e3887aa..000000000 --- a/modules/common/src/main/java/org/dromara/jpom/cron/ICron.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Code Technology Studio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.dromara.jpom.cron; - -import org.dromara.jpom.model.BaseIdModel; - -import java.util.List; - -/** - * 需要启动定时任务的 服务接口 - * - * @author bwcx_jzy - * @since 2021/12/23 - */ -public interface ICron { - - /** - * 查询启动中的 所有定时任务 列表 - * - * @return list - */ - List queryStartingList(); - - /** - * 启动所有的定时任务 - * - * @return 启动成功的任务数 - */ - default int startCron() { - List startingList = this.queryStartingList(); - if (startingList == null) { - return 0; - } - return (int) startingList.stream().map(ICron.this::checkCron).filter(aBoolean -> aBoolean).count(); - } - - /** - * 检查是否启动定时 - * - * @param data bean - * @return true 开启定时、false 关闭定时 - */ - boolean checkCron(T data); -} diff --git a/modules/common/src/main/java/org/dromara/jpom/model/BaseJsonModel.java b/modules/common/src/main/java/org/dromara/jpom/model/BaseJsonModel.java deleted file mode 100644 index d490c8a2e..000000000 --- a/modules/common/src/main/java/org/dromara/jpom/model/BaseJsonModel.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Code Technology Studio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.dromara.jpom.model; - -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; - -import java.io.Serializable; - -/** - * json方法基础类 - * - * @author bwcx_jzy - * @since 2019/4/10 - */ -public abstract class BaseJsonModel implements Serializable { - - @Override - public String toString() { - return JSONObject.toJSONString(this); - } - - public JSONObject toJson() { - return (JSONObject) JSON.toJSON(this); - } -} diff --git a/modules/common/src/main/java/org/dromara/jpom/model/BaseModel.java b/modules/common/src/main/java/org/dromara/jpom/model/BaseModel.java index 865a7c236..0efcf8afd 100644 --- a/modules/common/src/main/java/org/dromara/jpom/model/BaseModel.java +++ b/modules/common/src/main/java/org/dromara/jpom/model/BaseModel.java @@ -22,6 +22,7 @@ */ package org.dromara.jpom.model; +import cn.keepbx.jpom.model.BaseIdModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/modules/common/src/main/java/org/dromara/jpom/model/WebSocketMessageModel.java b/modules/common/src/main/java/org/dromara/jpom/model/WebSocketMessageModel.java index 727cd2880..e99165750 100644 --- a/modules/common/src/main/java/org/dromara/jpom/model/WebSocketMessageModel.java +++ b/modules/common/src/main/java/org/dromara/jpom/model/WebSocketMessageModel.java @@ -22,6 +22,7 @@ */ package org.dromara.jpom.model; +import cn.keepbx.jpom.model.BaseJsonModel; import com.alibaba.fastjson2.JSONObject; /** diff --git a/modules/common/src/main/java/org/dromara/jpom/model/data/AgentWhitelist.java b/modules/common/src/main/java/org/dromara/jpom/model/data/AgentWhitelist.java index 8fe1076e4..a4d627005 100644 --- a/modules/common/src/main/java/org/dromara/jpom/model/data/AgentWhitelist.java +++ b/modules/common/src/main/java/org/dromara/jpom/model/data/AgentWhitelist.java @@ -29,10 +29,10 @@ import cn.hutool.core.text.StrSplitter; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.model.BaseJsonModel; import org.dromara.jpom.system.ExtConfigBean; import org.dromara.jpom.util.FileUtils; import org.springframework.util.Assert; diff --git a/modules/common/src/main/java/org/dromara/jpom/model/system/AgentAutoUser.java b/modules/common/src/main/java/org/dromara/jpom/model/system/AgentAutoUser.java index 98e10c845..e430c311d 100644 --- a/modules/common/src/main/java/org/dromara/jpom/model/system/AgentAutoUser.java +++ b/modules/common/src/main/java/org/dromara/jpom/model/system/AgentAutoUser.java @@ -22,7 +22,7 @@ */ package org.dromara.jpom.model.system; -import org.dromara.jpom.model.BaseJsonModel; +import cn.keepbx.jpom.model.BaseJsonModel; /** * agent 端自动生成的密码实体 diff --git a/modules/common/src/main/java/org/dromara/jpom/script/CommandParam.java b/modules/common/src/main/java/org/dromara/jpom/script/CommandParam.java index 4fe0361db..4dadd9792 100644 --- a/modules/common/src/main/java/org/dromara/jpom/script/CommandParam.java +++ b/modules/common/src/main/java/org/dromara/jpom/script/CommandParam.java @@ -24,11 +24,11 @@ package org.dromara.jpom.script; import cn.hutool.core.lang.Opt; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONValidator; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.jpom.model.BaseJsonModel; import org.dromara.jpom.util.StringUtil; import java.util.*; diff --git a/modules/common/src/main/resources/banner.txt b/modules/common/src/main/resources/banner.txt index 4ffc06471..be8c4cb80 100644 --- a/modules/common/src/main/resources/banner.txt +++ b/modules/common/src/main/resources/banner.txt @@ -7,5 +7,5 @@ | | |_| - ➜ Jpom \ (•◡•) / (v2.10.41) + ➜ Jpom \ (•◡•) / (v2.10.42.4) diff --git a/modules/server/DockerfileBeta b/modules/server/DockerfileBeta index a75666417..f8105f9c2 100644 --- a/modules/server/DockerfileBeta +++ b/modules/server/DockerfileBeta @@ -29,7 +29,7 @@ LABEL maintainer="bwcx-jzy " LABEL documentation="https://jpom.top" ENV JPOM_HOME /usr/local/jpom-server -ENV JPOM_PKG_VERSION 2.10.41.3 +ENV JPOM_PKG_VERSION 2.10.42.4 ENV JPOM_PKG server-${JPOM_PKG_VERSION}-release.tar.gz ENV SHA1_NAME server-${JPOM_PKG_VERSION}-release.tar.gz.sha1 diff --git a/modules/server/DockerfileBetaJdk17 b/modules/server/DockerfileBetaJdk17 new file mode 100644 index 000000000..1d7a739fe --- /dev/null +++ b/modules/server/DockerfileBetaJdk17 @@ -0,0 +1,71 @@ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Code Technology Studio +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +FROM maven:3.8.5-openjdk-17-slim + +ARG BUILD_DATE +LABEL build_info="dromara/Jpom build-date:- ${BUILD_DATE}" +LABEL maintainer="bwcx-jzy " +LABEL documentation="https://jpom.top" + +ENV JPOM_HOME /usr/local/jpom-server +ENV JPOM_PKG_VERSION 2.10.42.4 +ENV JPOM_PKG server-${JPOM_PKG_VERSION}-release.tar.gz +ENV SHA1_NAME server-${JPOM_PKG_VERSION}-release.tar.gz.sha1 + +ENV JPOM_DATA_PATH ${JPOM_HOME}/data +ENV JPOM_LOG_PATH ${JPOM_HOME}/logs +# 数据目录 +ENV jpom.path ${JPOM_DATA_PATH} + +WORKDIR ${JPOM_HOME} + +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends git; + +# 时区 +ENV TZ Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone + +RUN mkdir -p ${JPOM_HOME} +# +RUN curl -LfSo ${JPOM_HOME}/${JPOM_PKG} https://download.jpom.top/beta/${JPOM_PKG_VERSION}/${JPOM_PKG} +RUN curl -LfsSo ${JPOM_HOME}/${SHA1_NAME} https://download.jpom.top/beta/${JPOM_PKG_VERSION}/${SHA1_NAME} && \ + ESUM=`cat ${JPOM_HOME}/${SHA1_NAME}` && \ + echo "${ESUM} ${JPOM_HOME}/${JPOM_PKG}" | sha1sum -c -; +RUN tar -zxvf ${JPOM_HOME}/${JPOM_PKG} -C ${JPOM_HOME} +RUN rm -rf ${JPOM_HOME}/${JPOM_PKG} + +# 将配置文件暂存默认目录,避免无法挂载 +RUN mv $JPOM_HOME/conf $JPOM_HOME/conf_default + +# 健康检查 +HEALTHCHECK CMD curl -X POST -f http://localhost:2122/check-system || exit 1 + +EXPOSE 2122 + +ENTRYPOINT ["/bin/bash", "./bin/BlockListener.sh"] + + + diff --git a/modules/server/DockerfileReleaseJdk17 b/modules/server/DockerfileReleaseJdk17 new file mode 100644 index 000000000..f38ca0229 --- /dev/null +++ b/modules/server/DockerfileReleaseJdk17 @@ -0,0 +1,71 @@ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Code Technology Studio +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +FROM maven:3.8.6-jdk-8 + +ARG BUILD_DATE +LABEL build_info="dromara/Jpom build-date:- ${BUILD_DATE}" +LABEL maintainer="bwcx-jzy " +LABEL documentation="https://jpom.top" + +ENV JPOM_HOME /usr/local/jpom-server +ENV JPOM_PKG_VERSION 2.10.41 +ENV JPOM_PKG server-${JPOM_PKG_VERSION}-release.tar.gz +ENV SHA1_NAME server-${JPOM_PKG_VERSION}-release.tar.gz.sha1 + +ENV JPOM_DATA_PATH ${JPOM_HOME}/data +ENV JPOM_LOG_PATH ${JPOM_HOME}/logs +# 数据目录 +ENV jpom.path ${JPOM_DATA_PATH} + +WORKDIR ${JPOM_HOME} + +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends git; + +# 时区 +ENV TZ Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone + +RUN mkdir -p ${JPOM_HOME} +# +RUN curl -LfSo ${JPOM_HOME}/${JPOM_PKG} https://download.jpom.top/release/${JPOM_PKG_VERSION}/${JPOM_PKG} +RUN curl -LfsSo ${JPOM_HOME}/${SHA1_NAME} https://download.jpom.top/release/${JPOM_PKG_VERSION}/${SHA1_NAME} && \ + ESUM=`cat ${JPOM_HOME}/${SHA1_NAME}` && \ + echo "${ESUM} ${JPOM_HOME}/${JPOM_PKG}" | sha1sum -c -; +RUN tar -zxvf ${JPOM_HOME}/${JPOM_PKG} -C ${JPOM_HOME} +RUN rm -rf ${JPOM_HOME}/${JPOM_PKG} + +# 将配置文件暂存默认目录,避免无法挂载 +RUN mv $JPOM_HOME/conf $JPOM_HOME/conf_default + +# 健康检查 +HEALTHCHECK CMD curl -X POST -f http://localhost:2122/check-system || exit 1 + +EXPOSE 2122 + +ENTRYPOINT ["/bin/bash", "./bin/BlockListener.sh"] + + + diff --git a/modules/server/pom.xml b/modules/server/pom.xml index 7c201affc..1d6223e46 100644 --- a/modules/server/pom.xml +++ b/modules/server/pom.xml @@ -29,13 +29,13 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml 4.0.0 Jpom Server server - 2.10.41 + 2.10.42.4 org.dromara.jpom.JpomServerApplication diff --git a/modules/server/src/main/java/org/dromara/jpom/build/BuildInfoManage.java b/modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteManage.java similarity index 96% rename from modules/server/src/main/java/org/dromara/jpom/build/BuildInfoManage.java rename to modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteManage.java index f84cccf7d..1722b56bb 100644 --- a/modules/server/src/main/java/org/dromara/jpom/build/BuildInfoManage.java +++ b/modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteManage.java @@ -31,12 +31,11 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.file.FileCopier; import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Tuple; +import cn.hutool.core.net.url.UrlQuery; import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.EnumUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.*; +import cn.keepbx.jpom.model.BaseIdModel; import cn.keepbx.jpom.plugins.IPlugin; import lombok.Builder; import lombok.Lombok; @@ -46,7 +45,6 @@ import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.func.assets.server.MachineDockerServer; import org.dromara.jpom.func.files.service.FileStorageService; -import org.dromara.jpom.model.BaseIdModel; import org.dromara.jpom.model.data.BuildInfoModel; import org.dromara.jpom.model.data.RepositoryModel; import org.dromara.jpom.model.docker.DockerInfoModel; @@ -86,7 +84,7 @@ import java.util.stream.Collectors; */ @Builder @Slf4j -public class BuildInfoManage implements Runnable { +public class BuildExecuteManage implements Runnable { /** * 构建线程池 @@ -97,7 +95,7 @@ public class BuildInfoManage implements Runnable { /** * 缓存构建中 */ - public static final Map BUILD_MANAGE_MAP = new ConcurrentHashMap<>(); + public static final Map BUILD_MANAGE_MAP = new ConcurrentHashMap<>(); private final TaskData taskData; private final BuildExtraModule buildExtraModule; @@ -148,10 +146,10 @@ public class BuildInfoManage implements Runnable { executorBuilder.setHandler(new ThreadPoolExecutor.DiscardPolicy() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { - if (r instanceof BuildInfoManage) { + if (r instanceof BuildExecuteManage) { // 取消任务 - BuildInfoManage buildInfoManage = (BuildInfoManage) r; - buildInfoManage.rejectedExecution(); + BuildExecuteManage buildExecuteManage = (BuildExecuteManage) r; + buildExecuteManage.rejectedExecution(); } else { log.warn("构建线程池拒绝了未知任务:{}", r.getClass()); } @@ -518,7 +516,15 @@ public class BuildInfoManage implements Runnable { // env file String attachEnv = this.buildExtraModule.getAttachEnv(); Opt.ofBlankAble(attachEnv).ifPresent(s -> { - logRecorder.system("读取附件变量:{}", attachEnv); + UrlQuery of = UrlQuery.of(attachEnv, CharsetUtil.CHARSET_UTF_8); + Map queryMap = of.getQueryMap(); + logRecorder.system("读取附件变量:{} {}", attachEnv, CollUtil.size(queryMap)); + // + Optional.ofNullable(queryMap).ifPresent(map -> { + for (Map.Entry entry : map.entrySet()) { + taskData.environmentMapBuilder.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue())); + } + }); Map envFileMap = FileUtils.readEnvFile(this.gitFile, s); taskData.environmentMapBuilder.putStr(envFileMap); }); @@ -702,7 +708,7 @@ public class BuildInfoManage implements Runnable { @Override public String execute() { - return BuildInfoManage.this.startReady(); + return BuildExecuteManage.this.startReady(); } }); suppliers.put("pull", new IProcessItem() { @@ -713,7 +719,7 @@ public class BuildInfoManage implements Runnable { @Override public String execute() { - return BuildInfoManage.this.pullAndCacheBuildEnv(); + return BuildExecuteManage.this.pullAndCacheBuildEnv(); } }); suppliers.put("executeCommand", new IProcessItem() { @@ -724,7 +730,7 @@ public class BuildInfoManage implements Runnable { @Override public String execute() { - return BuildInfoManage.this.executeCommand(); + return BuildExecuteManage.this.executeCommand(); } }); suppliers.put("packageFile", new IProcessItem() { @@ -735,7 +741,7 @@ public class BuildInfoManage implements Runnable { @Override public String execute() { - return BuildInfoManage.this.packageFile(); + return BuildExecuteManage.this.packageFile(); } }); suppliers.put("release", new IProcessItem() { @@ -746,7 +752,7 @@ public class BuildInfoManage implements Runnable { @Override public String execute() { - return BuildInfoManage.this.release(); + return BuildExecuteManage.this.release(); } }); suppliers.put("finish", new IProcessItem() { @@ -757,7 +763,7 @@ public class BuildInfoManage implements Runnable { @Override public String execute() { - return BuildInfoManage.this.finish(); + return BuildExecuteManage.this.finish(); } }); return suppliers; @@ -991,8 +997,8 @@ public class BuildInfoManage implements Runnable { * @return bool */ public static boolean cancelTaskById(String id) { - return Optional.ofNullable(BuildInfoManage.BUILD_MANAGE_MAP.get(id)).map(buildInfoManage1 -> { - buildInfoManage1.cancelTask("手动取消任务"); + return Optional.ofNullable(BuildExecuteManage.BUILD_MANAGE_MAP.get(id)).map(buildExecuteManage1 -> { + buildExecuteManage1.cancelTask("手动取消任务"); return true; }).orElse(false); } diff --git a/modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteService.java b/modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteService.java index baea5d29d..ab51a8720 100644 --- a/modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteService.java +++ b/modules/server/src/main/java/org/dromara/jpom/build/BuildExecuteService.java @@ -26,8 +26,9 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.SystemClock; import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ObjectUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.func.assets.server.MachineDockerServer; import org.dromara.jpom.func.files.service.FileStorageService; import org.dromara.jpom.model.BaseEnum; @@ -101,6 +102,9 @@ public class BuildExecuteService { * @return 错误消息 */ public String checkStatus(BuildInfoModel buildInfoModel) { + if (buildInfoModel == null) { + return "不存在对应的构建信息"; + } Integer status = buildInfoModel.getStatus(); if (status == null) { return null; @@ -124,7 +128,7 @@ public class BuildExecuteService { * @param parametersEnv 外部环境变量 * @return json */ - public JsonMessage start(String buildInfoId, UserModel userModel, Integer delay, int triggerBuildType, String buildRemark, Object... parametersEnv) { + public IJsonMessage start(String buildInfoId, UserModel userModel, Integer delay, int triggerBuildType, String buildRemark, Object... parametersEnv) { return this.start(buildInfoId, userModel, delay, triggerBuildType, buildRemark, null, parametersEnv); } @@ -140,7 +144,7 @@ public class BuildExecuteService { * @param parametersEnv 外部环境变量 * @return json */ - public JsonMessage start(String buildInfoId, UserModel userModel, Integer delay, + public IJsonMessage start(String buildInfoId, UserModel userModel, Integer delay, int triggerBuildType, String buildRemark, String checkRepositoryDiff, Object... parametersEnv) { synchronized (buildInfoId.intern()) { @@ -148,7 +152,7 @@ public class BuildExecuteService { String e = this.checkStatus(buildInfoModel); Assert.isNull(e, () -> e); // - boolean containsKey = BuildInfoManage.BUILD_MANAGE_MAP.containsKey(buildInfoModel.getId()); + boolean containsKey = BuildExecuteManage.BUILD_MANAGE_MAP.containsKey(buildInfoModel.getId()); Assert.state(!containsKey, "当前构建还在进行中"); // BuildExtraModule buildExtraModule = StringUtil.jsonConvert(buildInfoModel.getExtraData(), BuildExtraModule.class); @@ -196,7 +200,7 @@ public class BuildExecuteService { private void runTask(TaskData taskData, BuildExtraModule buildExtraModule) { String logId = this.insertLog(buildExtraModule, taskData); // - BuildInfoManage.BuildInfoManageBuilder builder = BuildInfoManage.builder() + BuildExecuteManage.BuildExecuteManageBuilder builder = BuildExecuteManage.builder() .taskData(taskData) .logId(logId) .scriptServer(scriptServer) diff --git a/modules/server/src/main/java/org/dromara/jpom/build/BuildExtraModule.java b/modules/server/src/main/java/org/dromara/jpom/build/BuildExtraModule.java index 0bdd817a4..150b72c20 100644 --- a/modules/server/src/main/java/org/dromara/jpom/build/BuildExtraModule.java +++ b/modules/server/src/main/java/org/dromara/jpom/build/BuildExtraModule.java @@ -191,6 +191,11 @@ public class BuildExtraModule extends BaseModel { */ private Integer cloneDepth; + /** + * 构建历史保留个数 + */ + private Integer resultKeepCount; + public boolean strictlyEnforce() { return strictlyEnforce != null && strictlyEnforce; } diff --git a/modules/server/src/main/java/org/dromara/jpom/build/DockerYmlDsl.java b/modules/server/src/main/java/org/dromara/jpom/build/DockerYmlDsl.java index 58c868af9..906436e0a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/build/DockerYmlDsl.java +++ b/modules/server/src/main/java/org/dromara/jpom/build/DockerYmlDsl.java @@ -30,12 +30,12 @@ import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.*; import cn.hutool.setting.yaml.YamlUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import cn.keepbx.jpom.plugins.IPlugin; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.func.assets.server.MachineDockerServer; -import org.dromara.jpom.model.BaseJsonModel; import org.dromara.jpom.model.docker.DockerInfoModel; import org.dromara.jpom.plugin.PluginFactory; import org.dromara.jpom.service.docker.DockerInfoService; diff --git a/modules/server/src/main/java/org/dromara/jpom/build/ReleaseManage.java b/modules/server/src/main/java/org/dromara/jpom/build/ReleaseManage.java index f7f2ef111..bdd9dc213 100644 --- a/modules/server/src/main/java/org/dromara/jpom/build/ReleaseManage.java +++ b/modules/server/src/main/java/org/dromara/jpom/build/ReleaseManage.java @@ -36,6 +36,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.ssh.JschUtil; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; @@ -46,7 +47,6 @@ import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.func.assets.model.MachineSshModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/common/BaseServerController.java b/modules/server/src/main/java/org/dromara/jpom/common/BaseServerController.java index c298a7e78..d03a2dc6c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/BaseServerController.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/BaseServerController.java @@ -25,6 +25,7 @@ package org.dromara.jpom.common; import cn.hutool.cache.Cache; import cn.hutool.cache.CacheUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.interceptor.LoginInterceptor; diff --git a/modules/server/src/main/java/org/dromara/jpom/common/GlobalDefaultExceptionHandler.java b/modules/server/src/main/java/org/dromara/jpom/common/GlobalDefaultExceptionHandler.java index 541e19e0d..e6de4a1ac 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/GlobalDefaultExceptionHandler.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/GlobalDefaultExceptionHandler.java @@ -22,6 +22,8 @@ */ package org.dromara.jpom.common; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.system.AgentException; import org.dromara.jpom.system.AuthorizeException; @@ -46,7 +48,7 @@ public class GlobalDefaultExceptionHandler extends BaseExceptionHandler { * @param e 异常 */ @ExceptionHandler({AuthorizeException.class}) - public JsonMessage delExceptionHandler(AuthorizeException e) { + public IJsonMessage delExceptionHandler(AuthorizeException e) { return e.getJsonMessage(); } @@ -61,7 +63,7 @@ public class GlobalDefaultExceptionHandler extends BaseExceptionHandler { * @since 2021-08-01 */ @ExceptionHandler({AgentException.class}) - public JsonMessage agentExceptionHandler(HttpServletRequest request, AgentException e) { + public IJsonMessage agentExceptionHandler(HttpServletRequest request, AgentException e) { Throwable cause = e.getCause(); if (cause != null) { log.error("controller {}", request.getRequestURI(), cause); diff --git a/modules/server/src/main/java/org/dromara/jpom/common/ServerConst.java b/modules/server/src/main/java/org/dromara/jpom/common/ServerConst.java index 815e747e1..3e227e0f4 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/ServerConst.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/ServerConst.java @@ -28,8 +28,6 @@ package org.dromara.jpom.common; */ public class ServerConst extends Const { - public static final String GROUP_STR = "group"; - /** * h2 数据库表名字段 */ @@ -75,4 +73,6 @@ public class ServerConst extends Const { public static final int ACCOUNT_LOCKED = 802; public static final String LOGIN_TIP = "登录信息已失效,重新登录"; public static final String ACCOUNT_LOCKED_TIP = "账号已经被禁用,不能使用"; + + public static final String CHECK_SYSTEM = "check-system"; } diff --git a/modules/server/src/main/java/org/dromara/jpom/common/forward/JsonMessageTransformServer.java b/modules/server/src/main/java/org/dromara/jpom/common/forward/JsonMessageTransformServer.java index e3c0c0a38..de40b25e7 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/forward/JsonMessageTransformServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/forward/JsonMessageTransformServer.java @@ -24,9 +24,9 @@ package org.dromara.jpom.common.forward; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.TypeReference; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.system.AgentException; import org.dromara.jpom.transport.INodeInfo; import org.dromara.jpom.transport.TransformServer; diff --git a/modules/server/src/main/java/org/dromara/jpom/common/forward/NodeForward.java b/modules/server/src/main/java/org/dromara/jpom/common/forward/NodeForward.java index 14cdbaab6..aa9e3c4b1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/forward/NodeForward.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/forward/NodeForward.java @@ -34,6 +34,8 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.BaseIdModel; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; @@ -41,10 +43,8 @@ import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.func.assets.model.MachineNodeModel; import org.dromara.jpom.func.assets.server.MachineNodeServer; -import org.dromara.jpom.model.BaseIdModel; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.user.UserModel; import org.dromara.jpom.system.AgentException; @@ -309,7 +309,20 @@ public class NodeForward { */ public static JsonMessage requestSharding(NodeModel nodeModel, NodeUrl nodeUrl, JSONObject jsonObject, File file, Function> doneCallback, BiConsumer streamProgress) throws IOException { INodeInfo nodeInfo = parseNodeInfo(nodeModel); - return requestSharding(nodeInfo, nodeModel.getWorkspaceId(), nodeUrl, jsonObject, file, doneCallback, streamProgress); + return requestSharding(nodeInfo, nodeModel.getWorkspaceId(), nodeUrl, jsonObject, file, File::getName, doneCallback, streamProgress); + } + + /** + * 普通消息转发 + * + * @param nodeModel 节点 + * @param nodeUrl 节点的url + * @param jsonObject 数据 + * @return JSON + */ + public static JsonMessage requestSharding(NodeModel nodeModel, NodeUrl nodeUrl, JSONObject jsonObject, File file, String fileName, Function> doneCallback, BiConsumer streamProgress) throws IOException { + INodeInfo nodeInfo = parseNodeInfo(nodeModel); + return requestSharding(nodeInfo, nodeModel.getWorkspaceId(), nodeUrl, jsonObject, file, file1 -> fileName, doneCallback, streamProgress); } /** @@ -322,7 +335,7 @@ public class NodeForward { */ public static JsonMessage requestSharding(MachineNodeModel machineNodeModel, NodeUrl nodeUrl, JSONObject jsonObject, File file, Function> doneCallback, BiConsumer streamProgress) throws IOException { INodeInfo nodeInfo = coverNodeInfo(machineNodeModel); - return requestSharding(nodeInfo, StrUtil.EMPTY, nodeUrl, jsonObject, file, doneCallback, streamProgress); + return requestSharding(nodeInfo, StrUtil.EMPTY, nodeUrl, jsonObject, file, File::getName, doneCallback, streamProgress); } /** @@ -335,12 +348,12 @@ public class NodeForward { * @param jsonObject 数据 * @return JSON */ - private static JsonMessage requestSharding(INodeInfo nodeInfo, String workspaceId, NodeUrl nodeUrl, JSONObject jsonObject, File file, Function> doneCallback, BiConsumer streamProgress) throws IOException { + private static JsonMessage requestSharding(INodeInfo nodeInfo, String workspaceId, NodeUrl nodeUrl, JSONObject jsonObject, File file, Function fileNameFn, Function> doneCallback, BiConsumer streamProgress) throws IOException { IUrlItem urlItem = parseUrlItem(nodeInfo, workspaceId, nodeUrl, DataContentType.FORM_URLENCODED); ServerConfig serverConfig = SpringUtil.getBean(ServerConfig.class); ServerConfig.NodeConfig nodeConfig = serverConfig.getNode(); long length = file.length(); - String fileName = file.getName(); + String fileName = fileNameFn.apply(file); Assert.state(length > 0, "空文件不能上传"); String md5 = SecureUtil.md5(file); int fileSliceSize = nodeConfig.getUploadFileSliceSize(); diff --git a/modules/server/src/main/java/org/dromara/jpom/common/interceptor/IpInterceptor.java b/modules/server/src/main/java/org/dromara/jpom/common/interceptor/IpInterceptor.java index 3c50852b0..3fb4f0057 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/interceptor/IpInterceptor.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/interceptor/IpInterceptor.java @@ -22,11 +22,13 @@ */ package org.dromara.jpom.common.interceptor; +import cn.hutool.core.lang.Validator; import cn.hutool.core.net.Ipv4Util; import cn.hutool.core.net.NetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; -import org.dromara.jpom.common.JsonMessage; +import cn.keepbx.jpom.model.JsonMessage; +import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.model.data.SystemIpConfigModel; import org.dromara.jpom.service.system.SystemParametersServer; import org.springframework.context.annotation.Configuration; @@ -44,6 +46,7 @@ import javax.servlet.http.HttpServletResponse; * @since 2021/4/18 */ @Configuration +@Slf4j public class IpInterceptor implements HandlerMethodInterceptor { private static final int IP_ACCESS_CODE = 999; @@ -55,7 +58,8 @@ public class IpInterceptor implements HandlerMethodInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { String clientIp = ServletUtil.getClientIP(request); - if (StrUtil.equals(NetUtil.LOCAL_IP, clientIp)) { + if (StrUtil.equals(NetUtil.LOCAL_IP, clientIp) || !Validator.isIpv4(clientIp)) { + // 本地 或者 非 ipv4 直接放开 return true; } SystemIpConfigModel config = systemParametersServer.getConfig(SystemIpConfigModel.ID, SystemIpConfigModel.class); @@ -64,12 +68,17 @@ public class IpInterceptor implements HandlerMethodInterceptor { } // 判断不允许访问 String prohibited = config.getProhibited(); - if (StrUtil.isNotEmpty(prohibited) && this.checkIp(prohibited, clientIp, false)) { - ServletUtil.write(response, JsonMessage.getString(IP_ACCESS_CODE, "Prohibition of access"), MediaType.APPLICATION_JSON_VALUE); - return false; - } - String allowed = config.getAllowed(); - if (StrUtil.isEmpty(allowed) || this.checkIp(allowed, clientIp, true)) { + try { + if (StrUtil.isNotEmpty(prohibited) && this.checkIp(prohibited, clientIp, false)) { + ServletUtil.write(response, JsonMessage.getString(IP_ACCESS_CODE, "Prohibition of access"), MediaType.APPLICATION_JSON_VALUE); + return false; + } + String allowed = config.getAllowed(); + if (StrUtil.isEmpty(allowed) || this.checkIp(allowed, clientIp, true)) { + return true; + } + } catch (Exception e) { + log.warn("IP白名单拦截异常,请检查配置是否正确", e); return true; } ServletUtil.write(response, JsonMessage.getString(IP_ACCESS_CODE, "Prohibition of access"), MediaType.APPLICATION_JSON_VALUE); diff --git a/modules/server/src/main/java/org/dromara/jpom/common/interceptor/LoginInterceptor.java b/modules/server/src/main/java/org/dromara/jpom/common/interceptor/LoginInterceptor.java index ac4a911d0..8c34f4860 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/interceptor/LoginInterceptor.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/interceptor/LoginInterceptor.java @@ -26,8 +26,8 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.jwt.JWT; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.model.user.UserModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/common/interceptor/PermissionInterceptor.java b/modules/server/src/main/java/org/dromara/jpom/common/interceptor/PermissionInterceptor.java index fa9c01b3f..eff1efac2 100644 --- a/modules/server/src/main/java/org/dromara/jpom/common/interceptor/PermissionInterceptor.java +++ b/modules/server/src/main/java/org/dromara/jpom/common/interceptor/PermissionInterceptor.java @@ -26,8 +26,8 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.BaseNodeModel; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.user.UserBindWorkspaceModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/IndexControl.java b/modules/server/src/main/java/org/dromara/jpom/controller/IndexControl.java index 42a9df907..984575824 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/IndexControl.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/IndexControl.java @@ -35,12 +35,14 @@ import cn.hutool.core.util.*; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.ContentType; import cn.hutool.system.SystemUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; +import org.dromara.jpom.common.JpomManifest; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.common.interceptor.NotLogin; @@ -164,7 +166,7 @@ public class IndexControl extends BaseServerController { */ @RequestMapping(value = "logo-image", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage logoImage(HttpServletResponse response) { + public IJsonMessage logoImage(HttpServletResponse response) { String logoFile = webConfig.getLogoFile(); String imageSrc = this.loadImageSrc(response, logoFile, "classpath:/logo/jpom.png", "jpg", "png", "gif"); return JsonMessage.success("", imageSrc); @@ -247,8 +249,8 @@ public class IndexControl extends BaseServerController { * @apiSuccess (222) {Object} data 系统还没有超级管理员需要初始化 */ @NotLogin - @RequestMapping(value = "check-system", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage checkSystem(HttpServletRequest request) { + @RequestMapping(value = ServerConst.CHECK_SYSTEM, produces = MediaType.APPLICATION_JSON_VALUE) + public IJsonMessage checkSystem(HttpServletRequest request) { JSONObject data = new JSONObject(); data.put("routerBase", UrlRedirectUtil.getHeaderProxyPath(request, ServerConst.PROXY_PATH)); // @@ -258,6 +260,7 @@ public class IndexControl extends BaseServerController { data.put("disabledGuide", webConfig.isDisabledGuide()); //data.put("disabledCaptcha", webConfig.isDisabledCaptcha()); data.put("notificationPlacement", webConfig.getNotificationPlacement()); + data.put("installId", JpomManifest.getInstance().getInstallId()); // 用于判断是否属于容器部署 boolean inDocker = StrUtil.isNotEmpty(SystemUtil.get("JPOM_PKG")); List extendPlugins = new ArrayList<>(); @@ -292,7 +295,7 @@ public class IndexControl extends BaseServerController { * @apiSuccess {JSON} data 菜单相关字段 */ @RequestMapping(value = "menus_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> menusData(HttpServletRequest request) { + public IJsonMessage> menusData(HttpServletRequest request) { NodeModel nodeModel = tryGetNode(); UserModel userModel = getUserModel(); String workspaceId = nodeService.getCheckUserWorkspace(request); @@ -342,7 +345,7 @@ public class IndexControl extends BaseServerController { */ @RequestMapping(value = "system_menus_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission - public JsonMessage> systemMenusData(HttpServletRequest request) { + public IJsonMessage> systemMenusData(HttpServletRequest request) { UserModel userModel = getUserModel(); // 菜单 InputStream inputStream = ResourceUtil.getStream("classpath:/menus/system.json"); @@ -417,7 +420,7 @@ public class IndexControl extends BaseServerController { * @return json */ @GetMapping(value = "generate-sharding-id", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage generateShardingId() { + public IJsonMessage generateShardingId() { Cache shardingIds = BaseServerController.SHARDING_IDS; int size = shardingIds.size(); Assert.state(size <= 100, "分片id最大同时使用 100 个"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/InstallController.java b/modules/server/src/main/java/org/dromara/jpom/controller/InstallController.java index 45afaae56..0f17f6b28 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/InstallController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/InstallController.java @@ -24,11 +24,12 @@ package org.dromara.jpom.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.interceptor.LoginInterceptor; import org.dromara.jpom.common.interceptor.NotLogin; import org.dromara.jpom.common.validator.ValidatorConfig; @@ -84,7 +85,7 @@ public class InstallController extends BaseServerController { */ @PostMapping(value = "install_submit.json", produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage installSubmit( + public IJsonMessage installSubmit( @ValidatorConfig(value = { @ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "登录名不能为空"), @ValidatorItem(value = ValidatorRule.NOT_BLANK, range = UserModel.USER_NAME_MIN_LEN + ":" + Const.ID_MAX_LEN, msg = "登录名长度范围" + UserModel.USER_NAME_MIN_LEN + "-" + Const.ID_MAX_LEN), diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/LoginControl.java b/modules/server/src/main/java/org/dromara/jpom/controller/LoginControl.java index dd17c73de..f3ada5c2e 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/LoginControl.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/LoginControl.java @@ -38,6 +38,8 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.ContentType; import cn.hutool.jwt.JWT; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthCallback; @@ -45,7 +47,6 @@ import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.request.AuthRequest; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.common.interceptor.LoginInterceptor; @@ -117,7 +118,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @RequestMapping(value = "rand-code", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage randCode() { + public IJsonMessage randCode() { if (webConfig.isDisabledCaptcha()) { return new JsonMessage<>(400, "验证码已禁用"); } @@ -178,7 +179,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @PostMapping(value = "userLogin", produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage userLogin(@ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "请输入登录信息") String loginName, + public IJsonMessage userLogin(@ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "请输入登录信息") String loginName, @ValidatorItem(value = ValidatorRule.NOT_EMPTY, msg = "请输入登录信息") String userPwd, String code, HttpServletRequest request) { @@ -251,7 +252,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @GetMapping(value = "oauth2-url", produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage oauth2LoginUrl(HttpServletRequest request, @ValidatorItem String provide) { + public IJsonMessage oauth2LoginUrl(HttpServletRequest request, @ValidatorItem String provide) { AuthRequest authRequest = Oauth2Factory.get(provide); String authorize = authRequest.authorize(null); JSONObject jsonObject = new JSONObject(); @@ -286,7 +287,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @PostMapping(value = "oauth2/login", produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage oauth2Callback(@ValidatorItem String code, + public IJsonMessage oauth2Callback(@ValidatorItem String code, @ValidatorItem String provide, String state, HttpServletRequest request) { @@ -355,7 +356,7 @@ public class LoginControl extends BaseServerController implements InitializingBe @GetMapping(value = "mfa_verify", produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage mfaVerify(String token, String code, HttpServletRequest request) { + public IJsonMessage mfaVerify(String token, String code, HttpServletRequest request) { String userId = MFA_TOKEN.get(token); if (StrUtil.isEmpty(userId)) { return new JsonMessage<>(201, "登录信息已经过期请重新登录"); @@ -377,7 +378,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @RequestMapping(value = "logout2", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage logout(HttpSession session) { + public IJsonMessage logout(HttpSession session) { session.invalidate(); return JsonMessage.success("退出成功"); } @@ -389,7 +390,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @RequestMapping(value = "renewal", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage renewalToken(HttpServletRequest request) { + public IJsonMessage renewalToken(HttpServletRequest request) { String token = request.getHeader(ServerOpenApi.HTTP_HEAD_AUTHORIZATION); if (StrUtil.isEmpty(token)) { return new JsonMessage<>(ServerConst.AUTHORIZE_TIME_OUT_CODE, "刷新token失败"); @@ -415,7 +416,7 @@ public class LoginControl extends BaseServerController implements InitializingBe */ @GetMapping(value = "login-config", produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage demoInfo() { + public IJsonMessage demoInfo() { String userDemoTip = userConfig.getDemoTip(); userDemoTip = StringUtil.convertFileStr(userDemoTip, StrUtil.EMPTY); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/ToolsController.java b/modules/server/src/main/java/org/dromara/jpom/controller/ToolsController.java index 70d06041d..949534302 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/ToolsController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/ToolsController.java @@ -26,7 +26,8 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.pattern.CronPatternUtil; -import org.dromara.jpom.common.JsonMessage; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; @@ -46,7 +47,7 @@ import java.util.stream.Collectors; public class ToolsController { @GetMapping(value = "cron", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> cron(@ValidatorItem String cron, @ValidatorItem int count, String date, boolean isMatchSecond) { + public IJsonMessage> cron(@ValidatorItem String cron, @ValidatorItem int count, String date, boolean isMatchSecond) { Date startDate = null; Date endDate = null; if (StrUtil.isNotEmpty(date)) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoController.java index 4079152d0..c0b5a6432 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoController.java @@ -31,6 +31,8 @@ import cn.hutool.core.lang.Tuple; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; @@ -39,7 +41,6 @@ import org.dromara.jpom.build.BuildUtil; import org.dromara.jpom.build.DockerYmlDsl; import org.dromara.jpom.build.ResultDirFileAction; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; @@ -123,7 +124,7 @@ public class BuildInfoController extends BaseServerController { */ @RequestMapping(value = "/build/list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getBuildList(HttpServletRequest request) { + public IJsonMessage> getBuildList(HttpServletRequest request) { // load list with page PageResultDto page = buildInfoService.listPage(request); page.each(buildInfoModel -> { @@ -144,7 +145,7 @@ public class BuildInfoController extends BaseServerController { */ @GetMapping(value = "/build/get", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getBuildListAll(String id, HttpServletRequest request) { + public IJsonMessage getBuildListAll(String id, HttpServletRequest request) { // load list with page BuildInfoModel buildInfoModel = buildInfoService.getByKey(id, request); Assert.notNull(buildInfoModel, "不存在对应的构建"); @@ -164,7 +165,7 @@ public class BuildInfoController extends BaseServerController { */ @GetMapping(value = "/build/list_group_all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getBuildGroupAll(HttpServletRequest request) { + public IJsonMessage> getBuildGroupAll(HttpServletRequest request) { // load list with page List group = buildInfoService.listGroup(request); return JsonMessage.success("", group); @@ -188,7 +189,7 @@ public class BuildInfoController extends BaseServerController { */ @RequestMapping(value = "/build/edit", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage updateBuild(String id, + public IJsonMessage updateBuild(String id, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "构建名称不能为空") String name, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "仓库信息不能为空") String repositoryId, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "构建产物目录不能为空,长度1-200", range = "1:200") String resultDirFile, @@ -198,6 +199,7 @@ public class BuildInfoController extends BaseServerController { String extraData, String group, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "构建方式不正确") int buildMode, String aliasCode, + @ValidatorItem(value = ValidatorRule.NUMBERS, msg = "请填写正确的保留天数") Integer resultKeepDay, HttpServletRequest request) { // 根据 repositoryId 查询仓库信息 RepositoryModel repositoryModel = repositoryService.getByKey(repositoryId, request); @@ -246,6 +248,7 @@ public class BuildInfoController extends BaseServerController { buildInfoModel.setResultDirFile(resultDirFile); buildInfoModel.setScript(script); buildInfoModel.setGroup(group); + buildInfoModel.setResultKeepDay(resultKeepDay); buildInfoModel.setBuildMode(buildMode); // 发布方式 BuildReleaseMethod releaseMethod1 = BaseEnum.getEnum(BuildReleaseMethod.class, releaseMethod); @@ -437,7 +440,7 @@ public class BuildInfoController extends BaseServerController { */ @RequestMapping(value = "/build/branch-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage branchList( + public IJsonMessage branchList( @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "仓库ID不能为空") String repositoryId) throws Exception { // 根据 repositoryId 查询仓库信息 RepositoryModel repositoryModel = repositoryService.getByKey(repositoryId, false); @@ -464,7 +467,7 @@ public class BuildInfoController extends BaseServerController { */ @PostMapping(value = "/build/delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据id") String id, HttpServletRequest request) { + public IJsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据id") String id, HttpServletRequest request) { // 查询构建信息 BuildInfoModel buildInfoModel = buildInfoService.getByKey(id, request); Objects.requireNonNull(buildInfoModel, "没有对应数据"); @@ -493,7 +496,7 @@ public class BuildInfoController extends BaseServerController { */ @PostMapping(value = "/build/clean-source", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage cleanSource(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据id") String id, HttpServletRequest request) { + public IJsonMessage cleanSource(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据id") String id, HttpServletRequest request) { // 查询构建信息 BuildInfoModel buildInfoModel = buildInfoService.getByKey(id, request); Objects.requireNonNull(buildInfoModel, "没有对应数据"); @@ -515,7 +518,7 @@ public class BuildInfoController extends BaseServerController { */ @GetMapping(value = "/build/sort-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId, HttpServletRequest request) { + public IJsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId, HttpServletRequest request) { if (StrUtil.equalsIgnoreCase(method, "top")) { buildInfoService.sortToTop(id, request); } else if (StrUtil.equalsIgnoreCase(method, "up")) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoHistoryController.java b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoHistoryController.java index 804457765..1af2da1f3 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoHistoryController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoHistoryController.java @@ -26,9 +26,10 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.build.BuildUtil; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorConfig; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; @@ -132,7 +133,7 @@ public class BuildInfoHistoryController extends BaseServerController { @RequestMapping(value = "/build/history/history_list.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> historyList() { + public IJsonMessage> historyList() { PageResultDto pageResultTemp = dbBuildHistoryLogService.listPage(getRequest()); pageResultTemp.each(buildHistoryLog -> { File file = BuildUtil.getHistoryPackageFile(buildHistoryLog.getBuildDataId(), buildHistoryLog.getBuildNumberId(), buildHistoryLog.getResultDirFile()); @@ -152,11 +153,11 @@ public class BuildInfoHistoryController extends BaseServerController { */ @RequestMapping(value = "/build/history/delete_log.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(@ValidatorConfig(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据")) String logId) { + public IJsonMessage delete(@ValidatorConfig(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据")) String logId) { List strings = StrUtil.splitTrim(logId, StrUtil.COMMA); for (String itemId : strings) { BuildHistoryLog buildHistoryLog = dbBuildHistoryLogService.getByKey(itemId, getRequest()); - JsonMessage jsonMessage = dbBuildHistoryLogService.deleteLogAndFile(buildHistoryLog); + IJsonMessage jsonMessage = dbBuildHistoryLogService.deleteLogAndFile(buildHistoryLog); if (!jsonMessage.success()) { return jsonMessage; } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoManageController.java b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoManageController.java index 614399a84..370f91f29 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoManageController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoManageController.java @@ -26,11 +26,12 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Opt; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; import org.dromara.jpom.build.*; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorConfig; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; @@ -105,7 +106,7 @@ public class BuildInfoManageController extends BaseServerController { */ @RequestMapping(value = "/build/manage/start", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage start(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, + public IJsonMessage start(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, String buildRemark, String resultDirFile, String branchName, @@ -152,7 +153,7 @@ public class BuildInfoManageController extends BaseServerController { */ @RequestMapping(value = "/build/manage/cancel", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage cancel(@ValidatorConfig(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据")) String id) { + public IJsonMessage cancel(@ValidatorConfig(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据")) String id) { BuildInfoModel item = buildInfoService.getByKey(id, getRequest()); Objects.requireNonNull(item, "没有对应数据"); String checkStatus = buildExecuteService.checkStatus(item); @@ -161,7 +162,7 @@ public class BuildInfoManageController extends BaseServerController { if (checkStatus == null) { return JsonMessage.success("当前状态不在进行中," + nowStatus.getDesc()); } - boolean status = BuildInfoManage.cancelTaskById(item.getId()); + boolean status = BuildExecuteManage.cancelTaskById(item.getId()); if (!status) { // 缓存中可能不存在数据,还是需要执行取消 buildInfoService.updateStatus(id, BuildStatus.Cancel, "手动取消"); @@ -177,7 +178,7 @@ public class BuildInfoManageController extends BaseServerController { */ @RequestMapping(value = "/build/manage/reRelease", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage reRelease(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String logId, + public IJsonMessage reRelease(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String logId, HttpServletRequest request) { String workspaceId = dbBuildHistoryLogService.getCheckUserWorkspace(request); BuildHistoryLog buildHistoryLog = dbBuildHistoryLogService.getByKey(logId, false, entity -> entity.set("workspaceId", workspaceId)); @@ -222,7 +223,7 @@ public class BuildInfoManageController extends BaseServerController { */ @RequestMapping(value = "/build/manage/get-now-log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getNowLog(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, + public IJsonMessage getNowLog(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "没有buildId") int buildId, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line) { BuildInfoModel item = buildInfoService.getByKey(id, getRequest()); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoTriggerController.java b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoTriggerController.java index a41c8e569..121392355 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoTriggerController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/build/BuildInfoTriggerController.java @@ -24,7 +24,12 @@ package org.dromara.jpom.controller.build; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; -import org.dromara.jpom.common.*; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.ServerOpenApi; +import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.model.data.BuildInfoModel; import org.dromara.jpom.model.user.UserModel; import org.dromara.jpom.permission.ClassFeature; @@ -67,7 +72,7 @@ public class BuildInfoTriggerController extends BaseServerController { */ @RequestMapping(value = "/build/trigger/url", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> getTriggerUrl(String id, String rest) { + public IJsonMessage> getTriggerUrl(String id, String rest) { BuildInfoModel item = buildInfoService.getByKey(id, getRequest()); UserModel user = getUser(); BuildInfoModel updateInfo; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/build/RepositoryController.java b/modules/server/src/main/java/org/dromara/jpom/controller/build/RepositoryController.java index 1ed4d6e66..4131444d1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/build/RepositoryController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/build/RepositoryController.java @@ -32,16 +32,20 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Tuple; import cn.hutool.core.lang.Validator; import cn.hutool.core.text.csv.*; -import cn.hutool.core.util.*; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; import cn.hutool.db.Entity; import cn.hutool.db.Page; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.build.BuildUtil; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.controller.build.repository.ImportRepoUtil; @@ -103,6 +107,19 @@ public class RepositoryController extends BaseServerController { return JsonMessage.success("获取成功", pageResult); } + /** + * load build list with params + * + * @return json + */ + @GetMapping(value = "/build/repository/list-group", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.LIST) + public IJsonMessage> getBuildGroupAll() { + // load list with page + List group = repositoryService.listGroup(); + return JsonMessage.success("", group); + } + /** * 下载导入模板 */ @@ -129,7 +146,7 @@ public class RepositoryController extends BaseServerController { CsvWriter writer = CsvUtil.getWriter(response.getWriter()); int pageInt = 0; Map paramMap = ServletUtil.getParamMap(request); - writer.writeLine("name", "address", "type", "protocol", "private rsa", "username", "password", "timeout(s)"); + writer.writeLine("name", "group", "address", "type", "protocol", "private rsa", "username", "password", "timeout(s)"); while (true) { // 下一页 paramMap.put("page", String.valueOf(++pageInt)); @@ -141,6 +158,7 @@ public class RepositoryController extends BaseServerController { .stream() .map((Function>) repositoryModel -> CollUtil.newArrayList( repositoryModel.getName(), + repositoryModel.getGroup(), repositoryModel.getGitUrl(), EnumUtil.likeValueOf(RepositoryModel.RepoType.class, repositoryModel.getRepoType()), EnumUtil.likeValueOf(GitProtocolEnum.class, repositoryModel.getProtocol()), @@ -167,7 +185,7 @@ public class RepositoryController extends BaseServerController { @PostMapping(value = "/build/repository/import-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) @SystemPermission - public JsonMessage importData(MultipartFile file, HttpServletRequest request) throws IOException { + public IJsonMessage importData(MultipartFile file, HttpServletRequest request) throws IOException { Assert.notNull(file, "没有上传文件"); String originalFilename = file.getOriginalFilename(); String extName = FileUtil.extName(originalFilename); @@ -191,6 +209,7 @@ public class RepositoryController extends BaseServerController { CsvRow csvRow = rows.get(i); String name = csvRow.getByName("name"); Assert.hasText(name, () -> StrUtil.format("第 {} 行 name 字段不能位空", finalI + 1)); + String group = csvRow.getByName("group"); String address = csvRow.getByName("address"); Assert.hasText(address, () -> StrUtil.format("第 {} 行 address 字段不能位空", finalI + 1)); String type = csvRow.getByName("type"); @@ -226,6 +245,7 @@ public class RepositoryController extends BaseServerController { RepositoryModel repositoryModel = repositoryService.queryByBean(where); // where.setName(name); + where.setGroup(group); where.setTimeout(timeout); where.setPassword(password); where.setRsaPrv(privateRsa); @@ -266,15 +286,22 @@ public class RepositoryController extends BaseServerController { */ @GetMapping(value = "/build/repository/get") @Feature(method = MethodFeature.LIST) - public JsonMessage loadRepositoryGet(String id, HttpServletRequest request) { + public IJsonMessage loadRepositoryGet(String id, HttpServletRequest request) { RepositoryModel repositoryModel = repositoryService.getByKey(id, request); Assert.notNull(repositoryModel, "没有对应的仓库"); return JsonMessage.success("", repositoryModel); } + /** + * 过滤前端多余避免核心字段被更新 + * + * @param repositoryModelReq 仓库对象 + * @return 可以更新的对象 + */ private RepositoryModel convertRequest(RepositoryModel repositoryModelReq) { RepositoryModel repositoryModel = new RepositoryModel(); repositoryModel.setName(repositoryModelReq.getName()); + repositoryModel.setGroup(repositoryModelReq.getGroup()); repositoryModel.setUserName(repositoryModelReq.getUserName()); repositoryModel.setId(repositoryModelReq.getId()); repositoryModel.setProtocol(repositoryModelReq.getProtocol()); @@ -295,7 +322,7 @@ public class RepositoryController extends BaseServerController { */ @PostMapping(value = "/build/repository/edit") @Feature(method = MethodFeature.EDIT) - public JsonMessage editRepository(RepositoryModel req, HttpServletRequest request) { + public IJsonMessage editRepository(RepositoryModel req, HttpServletRequest request) { RepositoryModel repositoryModelReq = this.convertRequest(req); repositoryModelReq.setWorkspaceId(repositoryService.covertGlobalWorkspace(request)); this.checkInfo(repositoryModelReq, request); @@ -341,7 +368,7 @@ public class RepositoryController extends BaseServerController { */ @PostMapping(value = "/build/repository/rest_hide_field") @Feature(method = MethodFeature.EDIT) - public JsonMessage restHideField(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage restHideField(@ValidatorItem String id, HttpServletRequest request) { RepositoryModel byKeyAndGlobal = repositoryService.getByKeyAndGlobal(id, request); RepositoryModel repositoryModel = new RepositoryModel(); repositoryModel.setId(byKeyAndGlobal.getId()); @@ -354,14 +381,14 @@ public class RepositoryController extends BaseServerController { @GetMapping(value = "/build/repository/provider_info") @Feature(method = MethodFeature.LIST) - public JsonMessage>> providerInfo() { + public IJsonMessage>> providerInfo() { Map> providerList = ImportRepoUtil.getProviderList(); return JsonMessage.success(HttpStatus.OK.name(), providerList); } @GetMapping(value = "/build/repository/authorize_repos") @Feature(method = MethodFeature.LIST) - public JsonMessage> authorizeRepos(HttpServletRequest request, + public IJsonMessage> authorizeRepos(HttpServletRequest request, @ValidatorItem String token, String address, @ValidatorItem String type, @@ -510,7 +537,7 @@ public class RepositoryController extends BaseServerController { */ @GetMapping(value = "/build/repository/sort-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage sortItem(@ValidatorItem String id, + public IJsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId, HttpServletRequest request) { if (StrUtil.equalsIgnoreCase(method, "top")) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerInfoController.java index 9cb79e26c..9f3d7ba44 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerInfoController.java @@ -24,11 +24,12 @@ package org.dromara.jpom.controller.docker; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.func.assets.model.MachineDockerModel; import org.dromara.jpom.func.assets.server.MachineDockerServer; @@ -74,7 +75,7 @@ public class DockerInfoController extends BaseServerController { */ @GetMapping(value = "api-versions", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> apiVersions() throws Exception { + public IJsonMessage> apiVersions() throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_CHECK_PLUGIN_NAME); List data = (List) plugin.execute("apiVersions"); return JsonMessage.success("", data); @@ -85,7 +86,7 @@ public class DockerInfoController extends BaseServerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(HttpServletRequest request) { + public IJsonMessage> list(HttpServletRequest request) { // load list with page PageResultDto resultDto = dockerInfoService.listPage(request); resultDto.each(dockerInfoModel -> { @@ -100,7 +101,7 @@ public class DockerInfoController extends BaseServerController { @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(@ValidatorItem String id, @ValidatorItem String name, String tags, HttpServletRequest request) throws Exception { + public IJsonMessage edit(@ValidatorItem String id, @ValidatorItem String name, String tags, HttpServletRequest request) throws Exception { DockerInfoModel dockerInfoModel = new DockerInfoModel(); dockerInfoModel.setId(id); dockerInfoModel.setName(name); @@ -116,7 +117,7 @@ public class DockerInfoController extends BaseServerController { @GetMapping(value = "del", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, HttpServletRequest request) throws Exception { + public IJsonMessage del(@ValidatorItem String id, HttpServletRequest request) throws Exception { dockerInfoService.delByKey(id, request); return JsonMessage.success("删除成功"); } @@ -132,7 +133,7 @@ public class DockerInfoController extends BaseServerController { @GetMapping(value = "sync-to-workspace", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission() - public JsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { + public IJsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { String nowWorkspaceId = dockerInfoService.getCheckUserWorkspace(getRequest()); // dockerInfoService.checkUserWorkspace(toWorkspaceId); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerSwarmInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerSwarmInfoController.java index dbbb9d0e5..20fbd4d5d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerSwarmInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/DockerSwarmInfoController.java @@ -25,8 +25,9 @@ package org.dromara.jpom.controller.docker; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.controller.docker.base.BaseDockerSwarmInfoController; import org.dromara.jpom.func.assets.model.MachineDockerModel; @@ -80,7 +81,7 @@ public class DockerSwarmInfoController extends BaseDockerSwarmInfoController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(HttpServletRequest request) { + public IJsonMessage> list(HttpServletRequest request) { // load list with page PageResultDto resultDto = dockerSwarmInfoService.listPage(request); resultDto.each(dockerSwarmInfoMode -> { @@ -96,7 +97,7 @@ public class DockerSwarmInfoController extends BaseDockerSwarmInfoController { */ @GetMapping(value = "list-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listAll(HttpServletRequest request) { + public IJsonMessage> listAll(HttpServletRequest request) { // load list with all List swarmInfoModes = dockerSwarmInfoService.listByWorkspace(request); return JsonMessage.success("", swarmInfoModes); @@ -104,7 +105,7 @@ public class DockerSwarmInfoController extends BaseDockerSwarmInfoController { @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(@ValidatorItem String id, + public IJsonMessage edit(@ValidatorItem String id, @ValidatorItem String name, @ValidatorItem String tag, HttpServletRequest request) throws Exception { @@ -149,7 +150,7 @@ public class DockerSwarmInfoController extends BaseDockerSwarmInfoController { @GetMapping(value = "del", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, HttpServletRequest request) throws Exception { + public IJsonMessage del(@ValidatorItem String id, HttpServletRequest request) throws Exception { dockerSwarmInfoService.delByKey(id, request); return JsonMessage.success("删除成功"); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerContainerController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerContainerController.java index 63e6ff9f8..43927c63f 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerContainerController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerContainerController.java @@ -24,9 +24,12 @@ package org.dromara.jpom.controller.docker.base; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; +import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -46,12 +49,13 @@ import java.util.Map; * @author bwcx_jzy * @since 2022/2/7 */ +@Slf4j public abstract class BaseDockerContainerController extends BaseDockerController { @GetMapping(value = "info", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage info(@ValidatorItem String id) throws Exception { + public IJsonMessage info(@ValidatorItem String id) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_CHECK_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); JSONObject info = plugin.execute("info", parameter, JSONObject.class); @@ -61,7 +65,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController @PostMapping(value = "prune", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) @SystemPermission - public JsonMessage prune(@ValidatorItem String id, @ValidatorItem String pruneType, String labels, String until, String dangling) throws Exception { + public IJsonMessage prune(@ValidatorItem String id, @ValidatorItem String pruneType, String labels, String until, String dangling) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("pruneType", pruneType); @@ -79,7 +83,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(@ValidatorItem String id) throws Exception { + public IJsonMessage> list(@ValidatorItem String id) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("name", getParameter("name")); @@ -95,7 +99,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @PostMapping(value = "list-compose", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listCompose(@ValidatorItem String id) throws Exception { + public IJsonMessage> listCompose(@ValidatorItem String id) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("name", getParameter("name")); @@ -111,7 +115,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @GetMapping(value = "remove", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, String containerId) throws Exception { + public IJsonMessage del(@ValidatorItem String id, String containerId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("containerId", containerId); @@ -124,8 +128,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @GetMapping(value = "start", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage start(@ValidatorItem String id, String containerId) throws Exception { - + public IJsonMessage start(@ValidatorItem String id, String containerId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("containerId", containerId); @@ -139,7 +142,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @GetMapping(value = "stop", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage stop(@ValidatorItem String id, String containerId) throws Exception { + public IJsonMessage stop(@ValidatorItem String id, String containerId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("containerId", containerId); @@ -153,8 +156,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @GetMapping(value = "restart", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage restart(@ValidatorItem String id, String containerId) throws Exception { - + public IJsonMessage restart(@ValidatorItem String id, String containerId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("containerId", containerId); @@ -167,8 +169,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @GetMapping(value = "stats", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage> stats(@ValidatorItem String id, String containerId) throws Exception { - + public IJsonMessage> stats(@ValidatorItem String id, String containerId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("containerId", containerId); @@ -181,7 +182,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @GetMapping(value = "inspect-container", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage inspectContainer(@ValidatorItem String id, @ValidatorItem String containerId) throws Exception { + public IJsonMessage inspectContainer(@ValidatorItem String id, @ValidatorItem String containerId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("containerId", containerId); @@ -197,7 +198,7 @@ public abstract class BaseDockerContainerController extends BaseDockerController */ @PostMapping(value = "update-container", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage updateContainer(@RequestBody JSONObject jsonObject) throws Exception { + public IJsonMessage updateContainer(@RequestBody JSONObject jsonObject) throws Exception { // @ValidatorItem String id, String containerId String id = jsonObject.getString("id"); Assert.hasText(id, "id 不能为空"); @@ -208,4 +209,37 @@ public abstract class BaseDockerContainerController extends BaseDockerController JSONObject results = (JSONObject) plugin.execute("updateContainer", parameter); return JsonMessage.success("执行成功", results); } + + /** + * drop old container and create new container + * + * @return json + */ + @PostMapping(value = "rebuild-container", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.EXECUTE) + public IJsonMessage reBuildContainer(@RequestBody JSONObject jsonObject) throws Exception { + String id = jsonObject.getString("id"); + String containerId = jsonObject.getString("containerId"); + Assert.hasText(id, "id 不能为空"); + Assert.hasText(jsonObject.getString("imageId"), "镜像不能为空"); + Assert.hasText(jsonObject.getString("name"), "容器名称不能为空"); + + IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); + Map parameter = this.toDockerParameter(id); + + // drop old container + if (StrUtil.isNotEmpty(containerId)) { + parameter.put("containerId", containerId); + try { + plugin.execute("removeContainer", parameter); + } catch (com.github.dockerjava.api.exception.NotFoundException notFoundException) { + log.warn(notFoundException.getMessage()); + } + } + + // create new container + parameter.putAll(jsonObject); + plugin.execute("createContainer", parameter); + return JsonMessage.success("重建成功"); + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerImagesController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerImagesController.java index cb013d9af..555c3a4c5 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerImagesController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerImagesController.java @@ -25,9 +25,10 @@ package org.dromara.jpom.controller.docker.base; import cn.hutool.core.io.FileUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.IdUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.permission.Feature; @@ -66,13 +67,13 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(@ValidatorItem String id) throws Exception { - + public IJsonMessage> list(@ValidatorItem String id) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("name", getParameter("name")); parameter.put("showAll", getParameter("showAll")); parameter.put("dangling", getParameter("dangling")); + parameter.put("workspaceId", getWorkspaceId()); List listContainer = (List) plugin.execute("listImages", parameter); return JsonMessage.success("", listContainer); } @@ -83,11 +84,11 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @GetMapping(value = "remove", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, String imageId) throws Exception { - + public IJsonMessage del(@ValidatorItem String id, String imageId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("imageId", imageId); + parameter.put("workspaceId", getWorkspaceId()); plugin.execute("removeImage", parameter); return JsonMessage.success("执行成功"); } @@ -98,11 +99,11 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @GetMapping(value = "batchRemove", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage batchRemove(@ValidatorItem String id, String[] imagesIds) throws Exception { - + public IJsonMessage batchRemove(@ValidatorItem String id, String[] imagesIds) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("imagesIds", imagesIds); + parameter.put("workspaceId", getWorkspaceId()); plugin.execute("batchRemove", parameter); return JsonMessage.success("执行成功"); } @@ -112,11 +113,11 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @GetMapping(value = "inspect", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage inspect(@ValidatorItem String id, String imageId) throws Exception { - + public IJsonMessage inspect(@ValidatorItem String id, String imageId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("imageId", imageId); + parameter.put("workspaceId", getWorkspaceId()); JSONObject inspectImage = (JSONObject) plugin.execute("inspectImage", parameter); return JsonMessage.success("", inspectImage); } @@ -126,11 +127,11 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @GetMapping(value = "pull-image", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage pullImage(@ValidatorItem String id, String repository) { - + public IJsonMessage pullImage(@ValidatorItem String id, String repository) { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("repository", repository); + parameter.put("workspaceId", getWorkspaceId()); // String uuid = IdUtil.fastSimpleUUID(); File file = FileUtil.file(serverConfig.getUserTempPath(), "docker-log", uuid + ".log"); @@ -158,7 +159,7 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @GetMapping(value = "pull-image-log", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getNowLog(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, + public IJsonMessage getNowLog(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line) { File file = FileUtil.file(serverConfig.getUserTempPath(), "docker-log", id + ".log"); if (!file.exists()) { @@ -173,7 +174,7 @@ public abstract class BaseDockerImagesController extends BaseDockerController { */ @PostMapping(value = "create-container", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage createContainer(@RequestBody JSONObject jsonObject) throws Exception { + public IJsonMessage createContainer(@RequestBody JSONObject jsonObject) throws Exception { String id = jsonObject.getString("id"); Assert.hasText(id, "id 不能为空"); Assert.hasText(jsonObject.getString("imageId"), "镜像不能为空"); @@ -182,6 +183,7 @@ public abstract class BaseDockerImagesController extends BaseDockerController { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.putAll(jsonObject); + parameter.put("workspaceId", getWorkspaceId()); plugin.execute("createContainer", parameter); return JsonMessage.success("创建成功"); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerNetworkController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerNetworkController.java index eb8ce980a..81e1a3d03 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerNetworkController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerNetworkController.java @@ -22,9 +22,10 @@ */ package org.dromara.jpom.controller.docker.base; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -47,8 +48,7 @@ public abstract class BaseDockerNetworkController extends BaseDockerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(@ValidatorItem String id, String name, String networkId) throws Exception { - + public IJsonMessage> list(@ValidatorItem String id, String name, String networkId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("name", name); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmInfoController.java index a6f4d8e69..02d144038 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmInfoController.java @@ -22,9 +22,10 @@ */ package org.dromara.jpom.controller.docker.base; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -44,7 +45,7 @@ public abstract class BaseDockerSwarmInfoController extends BaseDockerController @PostMapping(value = "node-list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> nodeList( + public IJsonMessage> nodeList( @ValidatorItem String id, String nodeId, String nodeName, String nodeRole) throws Exception { // @@ -66,7 +67,7 @@ public abstract class BaseDockerSwarmInfoController extends BaseDockerController */ @PostMapping(value = "update", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage update(@ValidatorItem String id, + public IJsonMessage update(@ValidatorItem String id, @ValidatorItem String nodeId, @ValidatorItem String availability, @ValidatorItem String role) throws Exception { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmServiceController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmServiceController.java index 3a24a6b20..2a47a03eb 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmServiceController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerSwarmServiceController.java @@ -31,10 +31,11 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.permission.Feature; @@ -90,7 +91,7 @@ public abstract class BaseDockerSwarmServiceController extends BaseDockerControl @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list( + public IJsonMessage> list( @ValidatorItem String id, String serviceId, String serviceName) throws Exception { // @@ -104,7 +105,7 @@ public abstract class BaseDockerSwarmServiceController extends BaseDockerControl @PostMapping(value = "task-list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> taskList( + public IJsonMessage> taskList( @ValidatorItem String id, String serviceId, String taskId, String taskName, String taskNode, String taskState) throws Exception { // @@ -121,7 +122,7 @@ public abstract class BaseDockerSwarmServiceController extends BaseDockerControl @GetMapping(value = "del", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage> del(@ValidatorItem String id, @ValidatorItem String serviceId) throws Exception { + public IJsonMessage> del(@ValidatorItem String id, @ValidatorItem String serviceId) throws Exception { // IPlugin plugin = PluginFactory.getPlugin(DockerSwarmInfoService.DOCKER_PLUGIN_NAME); Map map = this.toDockerParameter(id); @@ -132,7 +133,7 @@ public abstract class BaseDockerSwarmServiceController extends BaseDockerControl @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> edit(@RequestBody JSONObject jsonObject) throws Exception { + public IJsonMessage> edit(@RequestBody JSONObject jsonObject) throws Exception { // String id = jsonObject.getString("id"); IPlugin plugin = PluginFactory.getPlugin(DockerSwarmInfoService.DOCKER_PLUGIN_NAME); @@ -148,7 +149,7 @@ public abstract class BaseDockerSwarmServiceController extends BaseDockerControl */ @GetMapping(value = "start-log", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage pullImage(@ValidatorItem String id, @ValidatorItem String type, @ValidatorItem String dataId) throws Exception { + public IJsonMessage pullImage(@ValidatorItem String id, @ValidatorItem String type, @ValidatorItem String dataId) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerSwarmInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put(StrUtil.equalsIgnoreCase(type, "service") ? "serviceId" : "taskId", dataId); @@ -186,8 +187,8 @@ public abstract class BaseDockerSwarmServiceController extends BaseDockerControl */ @GetMapping(value = "pull-log", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getNowLog(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, - @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line) { + public IJsonMessage getNowLog(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, + @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line) { File file = FileUtil.file(serverConfig.getUserTempPath(), "docker-swarm-log", id + ".log"); if (!file.exists()) { return new JsonMessage<>(201, "还没有日志文件"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerVolumeController.java b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerVolumeController.java index c852b90c9..fc1413b02 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerVolumeController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/docker/base/BaseDockerVolumeController.java @@ -22,9 +22,10 @@ */ package org.dromara.jpom.controller.docker.base; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -47,7 +48,7 @@ public abstract class BaseDockerVolumeController extends BaseDockerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(@ValidatorItem String id) throws Exception { + public IJsonMessage> list(@ValidatorItem String id) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("name", getParameter("name")); @@ -62,8 +63,7 @@ public abstract class BaseDockerVolumeController extends BaseDockerController { */ @GetMapping(value = "remove", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, String volumeName) throws Exception { - + public IJsonMessage del(@ValidatorItem String id, String volumeName) throws Exception { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_PLUGIN_NAME); Map parameter = this.toDockerParameter(id); parameter.put("volumeName", volumeName); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorListController.java b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorListController.java index a5ac1404f..dac2bf24d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorListController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorListController.java @@ -26,9 +26,10 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.RegexPool; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.PageResultDto; @@ -84,7 +85,7 @@ public class MonitorListController extends BaseServerController { */ @RequestMapping(value = "getMonitorList", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getMonitorList() { + public IJsonMessage> getMonitorList() { PageResultDto pageResultDto = monitorService.listPage(getRequest()); return JsonMessage.success("", pageResultDto); } @@ -97,7 +98,7 @@ public class MonitorListController extends BaseServerController { */ @RequestMapping(value = "deleteMonitor", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage deleteMonitor(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "删除失败") String id) throws SQLException { + public IJsonMessage deleteMonitor(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "删除失败") String id) throws SQLException { // HttpServletRequest request = getRequest(); int delByKey = monitorService.delByKey(id, request); @@ -119,7 +120,7 @@ public class MonitorListController extends BaseServerController { */ @RequestMapping(value = "updateMonitor", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage updateMonitor(String id, + public IJsonMessage updateMonitor(String id, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "监控名称不能为空") String name, @ValidatorItem(msg = "请配置监控周期") String execCron, String notifyUser, String webhook) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorLogController.java b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorLogController.java index 9e6dcecd8..5c4381aea 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorLogController.java @@ -22,8 +22,9 @@ */ package org.dromara.jpom.controller.monitor; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.log.MonitorNotifyLog; import org.dromara.jpom.permission.ClassFeature; @@ -59,7 +60,7 @@ public class MonitorLogController extends BaseServerController { */ @RequestMapping(value = "list_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listData() { + public IJsonMessage> listData() { PageResultDto pageResult = dbMonitorNotifyLogService.listPage(getRequest()); return JsonMessage.success("获取成功", pageResult); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorUserOptListController.java b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorUserOptListController.java index 3daf60469..71ae084c9 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorUserOptListController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/MonitorUserOptListController.java @@ -25,10 +25,11 @@ package org.dromara.jpom.controller.monitor; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.PageResultDto; @@ -68,7 +69,7 @@ public class MonitorUserOptListController extends BaseServerController { @RequestMapping(value = "list_data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getMonitorList() { + public IJsonMessage> getMonitorList() { PageResultDto pageResultDto = monitorUserOptService.listPage(getRequest()); return JsonMessage.success("", pageResultDto); } @@ -80,7 +81,7 @@ public class MonitorUserOptListController extends BaseServerController { */ @RequestMapping(value = "type_data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getOperateTypeList() { + public IJsonMessage getOperateTypeList() { JSONObject jsonObject = new JSONObject(); // List classFeatureList = Arrays.stream(ClassFeature.values()) @@ -116,7 +117,7 @@ public class MonitorUserOptListController extends BaseServerController { */ @RequestMapping(value = "delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage deleteMonitor(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "删除失败") String id) { + public IJsonMessage deleteMonitor(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "删除失败") String id) { // monitorUserOptService.delByKey(id, getRequest()); return JsonMessage.success("删除成功"); @@ -133,7 +134,7 @@ public class MonitorUserOptListController extends BaseServerController { */ @RequestMapping(value = "update", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage updateMonitor(String id, + public IJsonMessage updateMonitor(String id, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "监控名称不能为空") String name, String notifyUser, String monitorUser, @@ -208,7 +209,7 @@ public class MonitorUserOptListController extends BaseServerController { */ @RequestMapping(value = "changeStatus", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage changeStatus(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "id不能为空") String id, + public IJsonMessage changeStatus(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "id不能为空") String id, String status) { MonitorUserOptModel monitorModel = monitorUserOptService.getByKey(id); Assert.notNull(monitorModel, "不存在监控项啦"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/SystemMailConfigController.java b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/SystemMailConfigController.java index 814755f42..0519d3eab 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/monitor/SystemMailConfigController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/monitor/SystemMailConfigController.java @@ -23,10 +23,11 @@ package org.dromara.jpom.controller.monitor; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSON; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.data.MailAccountModel; import org.dromara.jpom.monitor.EmailUtil; import org.dromara.jpom.permission.ClassFeature; @@ -71,7 +72,7 @@ public class SystemMailConfigController extends BaseServerController { */ @PostMapping(value = "mail-config-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage mailConfigData() { + public IJsonMessage mailConfigData() { MailAccountModel item = systemParametersServer.getConfig(MailAccountModel.ID, MailAccountModel.class); if (item != null) { item.setPass(null); @@ -81,7 +82,7 @@ public class SystemMailConfigController extends BaseServerController { @PostMapping(value = "mailConfig_save.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage listData(MailAccountModel mailAccountModel) throws Exception { + public IJsonMessage listData(MailAccountModel mailAccountModel) throws Exception { Assert.notNull(mailAccountModel, "请填写信息,并检查是否填写合法"); Assert.hasText(mailAccountModel.getHost(), "请填写host"); Assert.hasText(mailAccountModel.getUser(), "请填写user"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeEditController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeEditController.java index bc60d3eea..01bdbb16c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeEditController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeEditController.java @@ -23,8 +23,9 @@ package org.dromara.jpom.controller.node; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.PageResultDto; @@ -90,7 +91,7 @@ public class NodeEditController extends BaseServerController { @PostMapping(value = "list_data.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listJson(HttpServletRequest request) { + public IJsonMessage> listJson(HttpServletRequest request) { PageResultDto nodeModelPageResultDto = nodeService.listPage(request); nodeModelPageResultDto.each(nodeModel -> nodeModel.setMachineNodeData(machineNodeServer.getByKey(nodeModel.getMachineId()))); return JsonMessage.success("", nodeModelPageResultDto); @@ -98,14 +99,14 @@ public class NodeEditController extends BaseServerController { @GetMapping(value = "list_data_all.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listDataAll() { + public IJsonMessage> listDataAll() { List list = nodeService.listByWorkspace(getRequest()); return JsonMessage.success("", list); } @GetMapping(value = "list_data_by_workspace_id.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listDataAll(@ValidatorItem String workspaceId) { + public IJsonMessage> listDataAll(@ValidatorItem String workspaceId) { nodeService.checkUserWorkspace(workspaceId); NodeModel nodeModel = new NodeModel(); if (!StrUtil.equals(workspaceId, ServerConst.WORKSPACE_GLOBAL)) { @@ -122,14 +123,14 @@ public class NodeEditController extends BaseServerController { */ @GetMapping(value = "list_group_all.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listGroupAll() { - List listGroup = nodeService.listGroup(getRequest()); + public IJsonMessage> listGroupAll(HttpServletRequest request) { + List listGroup = nodeService.listGroup(request); return JsonMessage.success("", listGroup); } @PostMapping(value = "save.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(HttpServletRequest request) { + public IJsonMessage save(HttpServletRequest request) { nodeService.update(request); return JsonMessage.success("操作成功"); } @@ -143,7 +144,7 @@ public class NodeEditController extends BaseServerController { */ @PostMapping(value = "del.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id) { + public IJsonMessage del(@ValidatorItem String id) { HttpServletRequest request = getRequest(); this.checkDataBind(id, request, "删除"); // @@ -197,7 +198,7 @@ public class NodeEditController extends BaseServerController { */ @GetMapping(value = "unbind.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage unbind(String id) { + public IJsonMessage unbind(String id) { HttpServletRequest request = getRequest(); this.checkDataBind(id, request, "解绑"); // @@ -218,7 +219,7 @@ public class NodeEditController extends BaseServerController { @GetMapping(value = "sync-to-workspace", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission() - public JsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { + public IJsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { String nowWorkspaceId = nodeService.getCheckUserWorkspace(getRequest()); // nodeService.checkUserWorkspace(toWorkspaceId); @@ -236,7 +237,7 @@ public class NodeEditController extends BaseServerController { */ @GetMapping(value = "sort-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId) { + public IJsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId) { HttpServletRequest request = getRequest(); if (StrUtil.equalsIgnoreCase(method, "top")) { nodeService.sortToTop(id, request); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeProjectInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeProjectInfoController.java index 373b9ce58..5a89bff80 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeProjectInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeProjectInfoController.java @@ -25,8 +25,13 @@ package org.dromara.jpom.controller.node; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.*; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.ServerOpenApi; +import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.data.NodeModel; @@ -75,7 +80,7 @@ public class NodeProjectInfoController extends BaseServerController { * 加载节点项目列表 */ @PostMapping(value = "node_project_list", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> nodeProjectList() { + public IJsonMessage> nodeProjectList() { PageResultDto resultDto = projectInfoCacheService.listPageNode(getRequest()); return JsonMessage.success("success", resultDto); } @@ -89,7 +94,7 @@ public class NodeProjectInfoController extends BaseServerController { * @author Hotstrip */ @PostMapping(value = "project_list", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> projectList() { + public IJsonMessage> projectList() { PageResultDto resultDto = projectInfoCacheService.listPage(getRequest()); return JsonMessage.success("success", resultDto); } @@ -102,7 +107,7 @@ public class NodeProjectInfoController extends BaseServerController { * @author Hotstrip */ @GetMapping(value = "project_list_all", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> projectListAll() { + public IJsonMessage> projectListAll() { List projectInfoCacheModels = projectInfoCacheService.listByWorkspace(getRequest()); return JsonMessage.success("", projectInfoCacheModels); } @@ -114,7 +119,7 @@ public class NodeProjectInfoController extends BaseServerController { */ @GetMapping(value = "list-project-group-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listGroupAll(HttpServletRequest request) { + public IJsonMessage> listGroupAll(HttpServletRequest request) { List listGroup = projectInfoCacheService.listGroup(request); return JsonMessage.success("", listGroup); } @@ -126,7 +131,7 @@ public class NodeProjectInfoController extends BaseServerController { */ @GetMapping(value = "sync_project", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.PROJECT, method = MethodFeature.DEL) - public JsonMessage syncProject(String nodeId) { + public IJsonMessage syncProject(String nodeId) { NodeModel nodeModel = nodeService.getByKey(nodeId); Assert.notNull(nodeModel, "对应的节点不存在"); int count = projectInfoCacheService.delCache(nodeId, getRequest()); @@ -142,7 +147,7 @@ public class NodeProjectInfoController extends BaseServerController { @GetMapping(value = "clear_all_project", produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission(superUser = true) @Feature(cls = ClassFeature.PROJECT, method = MethodFeature.DEL) - public JsonMessage clearAll() { + public IJsonMessage clearAll() { Entity where = Entity.create(); where.set("id", " <> id"); int del = projectInfoCacheService.del(where); @@ -159,7 +164,7 @@ public class NodeProjectInfoController extends BaseServerController { */ @GetMapping(value = "project-sort-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId) { + public IJsonMessage sortItem(@ValidatorItem String id, @ValidatorItem String method, String compareId) { HttpServletRequest request = getRequest(); if (StrUtil.equalsIgnoreCase(method, "top")) { projectInfoCacheService.sortToTop(id, request); @@ -181,7 +186,7 @@ public class NodeProjectInfoController extends BaseServerController { */ @RequestMapping(value = "project-trigger-url", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> getTriggerUrl(String id, String rest) { + public IJsonMessage> getTriggerUrl(String id, String rest) { ProjectInfoCacheModel item = projectInfoCacheService.getByKey(id, getRequest()); UserModel user = getUser(); ProjectInfoCacheModel updateItem; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeUpdateController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeUpdateController.java index 02db95ce3..fad474806 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeUpdateController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeUpdateController.java @@ -27,7 +27,9 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; @@ -88,7 +90,7 @@ public class NodeUpdateController extends BaseServerController { */ @GetMapping(value = "download_remote.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.REMOTE_DOWNLOAD) - public JsonMessage downloadRemote() throws IOException { + public IJsonMessage downloadRemote() throws IOException { String saveDir = serverConfig.getAgentPath().getAbsolutePath(); Tuple download = RemoteVersion.download(saveDir, Type.Agent, false); // 保存文件 @@ -104,7 +106,7 @@ public class NodeUpdateController extends BaseServerController { * @see AgentFileModel */ @GetMapping(value = "check_version.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage checkVersion() { + public IJsonMessage checkVersion() { cn.keepbx.jpom.RemoteVersion remoteVersion = RemoteVersion.cacheInfo(); AgentFileModel agentFileModel = systemParametersServer.getConfig(AgentFileModel.ID, AgentFileModel.class, agentFileModel1 -> { if (agentFileModel1 == null || !FileUtil.exist(agentFileModel1.getSavePath())) { @@ -132,11 +134,11 @@ public class NodeUpdateController extends BaseServerController { @RequestMapping(value = "upload-agent-sharding", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission @Feature(method = MethodFeature.UPLOAD, log = false) - public JsonMessage uploadAgentSharding(MultipartFile file, - String sliceId, - Integer totalSlice, - Integer nowSlice, - String fileSumMd5) throws IOException { + public IJsonMessage uploadAgentSharding(MultipartFile file, + String sliceId, + Integer totalSlice, + Integer nowSlice, + String fileSumMd5) throws IOException { File userTempPath = serverConfig.getUserTempPath(); this.uploadSharding(file, userTempPath.getAbsolutePath(), sliceId, totalSlice, nowSlice, fileSumMd5, "jar", "zip"); return JsonMessage.success("上传成功"); @@ -145,7 +147,7 @@ public class NodeUpdateController extends BaseServerController { @RequestMapping(value = "upload-agent-sharding-merge", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission @Feature(method = MethodFeature.UPLOAD) - public JsonMessage uploadAgent(String sliceId, + public IJsonMessage uploadAgent(String sliceId, Integer totalSlice, String fileSumMd5) throws IOException { File agentPath = serverConfig.getAgentPath(); @@ -188,7 +190,7 @@ public class NodeUpdateController extends BaseServerController { } @GetMapping(value = "fast_install.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage fastInstall() { + public IJsonMessage fastInstall() { boolean beta = RemoteVersion.betaRelease(); InputStream inputStream = ExtConfigBean.getConfigResourceInputStream(beta ? "/fast-install-beta.json" : "/fast-install-release.json"); String json = IoUtil.read(inputStream, CharsetUtil.CHARSET_UTF_8); @@ -207,7 +209,7 @@ public class NodeUpdateController extends BaseServerController { } @GetMapping(value = "pull_fast_install_result.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> pullFastInstallResult(String removeId) { + public IJsonMessage> pullFastInstallResult(String removeId) { Collection jsonObjects = NodeInfoController.listReceiveCache(removeId); jsonObjects = jsonObjects.stream().map(jsonObject -> { JSONObject clone = jsonObject.clone(); @@ -218,7 +220,7 @@ public class NodeUpdateController extends BaseServerController { } @GetMapping(value = "confirm_fast_install.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> confirmFastInstall(HttpServletRequest request, + public IJsonMessage> confirmFastInstall(HttpServletRequest request, @ValidatorItem String id, @ValidatorItem String ip, int port) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeWelcomeController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeWelcomeController.java index 61491e618..0d0d04f58 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeWelcomeController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/NodeWelcomeController.java @@ -29,9 +29,10 @@ import cn.hutool.db.Entity; import cn.hutool.db.Page; import cn.hutool.db.sql.Direction; import cn.hutool.db.sql.Order; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.func.assets.model.MachineNodeModel; @@ -68,7 +69,7 @@ public class NodeWelcomeController extends BaseServerController { } @PostMapping(value = "node_monitor_data.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> nodeMonitorJson(String machineId) { + public IJsonMessage> nodeMonitorJson(String machineId) { NodeModel node = tryGetNode(); List list = this.getList(node, machineId); Assert.notEmpty(list, "没有查询到任何数据"); @@ -104,7 +105,7 @@ public class NodeWelcomeController extends BaseServerController { } @RequestMapping(value = "processList", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> getProcessList(HttpServletRequest request, String machineId) { + public IJsonMessage> getProcessList(HttpServletRequest request, String machineId) { NodeModel node = tryGetNode(); if (node != null) { return NodeForward.request(node, request, NodeUrl.ProcessList); @@ -116,7 +117,7 @@ public class NodeWelcomeController extends BaseServerController { @RequestMapping(value = "kill.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission - public JsonMessage kill(HttpServletRequest request, String machineId) { + public IJsonMessage kill(HttpServletRequest request, String machineId) { NodeModel node = tryGetNode(); if (node != null) { return NodeForward.request(node, request, NodeUrl.Kill); @@ -127,7 +128,7 @@ public class NodeWelcomeController extends BaseServerController { } @GetMapping(value = "machine-info", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage machineInfo(String machineId) { + public IJsonMessage machineInfo(String machineId) { NodeModel nodeModel = tryGetNode(); String useMachineId = Optional.ofNullable(nodeModel).map(BaseMachineModel::getMachineId).orElse(machineId); MachineNodeModel model = machineNodeServer.getByKey(useMachineId); @@ -139,7 +140,7 @@ public class NodeWelcomeController extends BaseServerController { } @GetMapping(value = "disk-info", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> diskInfo(HttpServletRequest request, String machineId) { + public IJsonMessage> diskInfo(HttpServletRequest request, String machineId) { NodeModel node = tryGetNode(); if (node != null) { return NodeForward.request(node, request, NodeUrl.DiskInfo); @@ -150,7 +151,7 @@ public class NodeWelcomeController extends BaseServerController { } @GetMapping(value = "hw-disk-info", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> hwDiskInfo(HttpServletRequest request, String machineId) { + public IJsonMessage> hwDiskInfo(HttpServletRequest request, String machineId) { NodeModel node = tryGetNode(); if (node != null) { return NodeForward.request(node, request, NodeUrl.HwDiskInfo); @@ -161,7 +162,7 @@ public class NodeWelcomeController extends BaseServerController { } @GetMapping(value = "network-interfaces", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> networkInterfaces(HttpServletRequest request, String machineId) { + public IJsonMessage> networkInterfaces(HttpServletRequest request, String machineId) { NodeModel node = tryGetNode(); if (node != null) { return NodeForward.request(node, request, NodeUrl.NetworkInterfaces); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/EditProjectController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/EditProjectController.java index c9282b364..47b64a95c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/EditProjectController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/EditProjectController.java @@ -22,9 +22,10 @@ */ package org.dromara.jpom.controller.node.manage; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -65,7 +66,7 @@ public class EditProjectController extends BaseServerController { } @RequestMapping(value = "getProjectData.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectData(@ValidatorItem String id) { + public IJsonMessage getProjectData(@ValidatorItem String id) { JSONObject projectInfo = projectInfoCacheService.getItem(getNode(), id); return JsonMessage.success("", projectInfo); } @@ -78,7 +79,7 @@ public class EditProjectController extends BaseServerController { * @author Hotstrip */ @RequestMapping(value = "project-access-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> projectAccessList() { + public IJsonMessage> projectAccessList() { List jsonArray = whitelistDirectoryService.getProjectDirectory(getNode()); return JsonMessage.success("success", jsonArray); } @@ -91,7 +92,7 @@ public class EditProjectController extends BaseServerController { */ @RequestMapping(value = "saveProject", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage saveProject(String id, HttpServletRequest httpServletRequest) { + public IJsonMessage saveProject(String id, HttpServletRequest httpServletRequest) { NodeModel node = getNode(); // @@ -110,7 +111,7 @@ public class EditProjectController extends BaseServerController { */ @RequestMapping(value = "release-outgiving", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage releaseOutgiving(String id, HttpServletRequest request) { + public IJsonMessage releaseOutgiving(String id, HttpServletRequest request) { NodeModel node = getNode(); JsonMessage jsonMessage = NodeForward.request(getNode(), request, NodeUrl.Manage_ReleaseOutGiving); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/ProjectManageControl.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/ProjectManageControl.java index ff1623589..fcc9a2e5a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/ProjectManageControl.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/ProjectManageControl.java @@ -34,11 +34,12 @@ import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -108,7 +109,7 @@ public class ProjectManageControl extends BaseServerController { */ @RequestMapping(value = "project_copy_list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage projectCopyList() { + public IJsonMessage projectCopyList() { return NodeForward.request(getNode(), getRequest(), NodeUrl.Manage_ProjectCopyList); } @@ -118,7 +119,7 @@ public class ProjectManageControl extends BaseServerController { * @return json */ @RequestMapping(value = "getProjectPort", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectPort() { + public IJsonMessage getProjectPort() { return NodeForward.request(getNode(), getRequest(), NodeUrl.Manage_GetProjectPort); } @@ -128,7 +129,7 @@ public class ProjectManageControl extends BaseServerController { * @return json */ @RequestMapping(value = "getProjectCopyPort", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getProjectCopyPort() { + public IJsonMessage getProjectCopyPort() { return NodeForward.request(getNode(), getRequest(), NodeUrl.Manage_GetProjectCopyPort); } @@ -140,7 +141,7 @@ public class ProjectManageControl extends BaseServerController { */ @PostMapping(value = "get_project_info", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getProjectInfo() { + public IJsonMessage> getProjectInfo() { PageResultDto modelPageResultDto = projectInfoCacheService.listPage(getRequest()); // JSONArray jsonArray = projectInfoService.listAll(nodeModel, getRequest()); return JsonMessage.success("", modelPageResultDto); @@ -154,7 +155,7 @@ public class ProjectManageControl extends BaseServerController { */ @PostMapping(value = "deleteProject", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage deleteProject(@ValidatorItem(value = ValidatorRule.NOT_BLANK) String id, String copyId) { + public IJsonMessage deleteProject(@ValidatorItem(value = ValidatorRule.NOT_BLANK) String id, String copyId) { NodeModel nodeModel = getNode(); HttpServletRequest servletRequest = getRequest(); if (StrUtil.isEmpty(copyId)) { @@ -192,7 +193,7 @@ public class ProjectManageControl extends BaseServerController { */ @RequestMapping(value = "restart", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage restart() { + public IJsonMessage restart() { NodeModel nodeModel = getNode(); return NodeForward.request(nodeModel, getRequest(), NodeUrl.Manage_Restart); } @@ -207,7 +208,7 @@ public class ProjectManageControl extends BaseServerController { */ @RequestMapping(value = "start", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage start() { + public IJsonMessage start() { NodeModel nodeModel = getNode(); return NodeForward.request(nodeModel, getRequest(), NodeUrl.Manage_Start); } @@ -222,7 +223,7 @@ public class ProjectManageControl extends BaseServerController { */ @RequestMapping(value = "stop", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage stop() { + public IJsonMessage stop() { NodeModel nodeModel = getNode(); return NodeForward.request(nodeModel, getRequest(), NodeUrl.Manage_Stop); } @@ -321,7 +322,7 @@ public class ProjectManageControl extends BaseServerController { */ @PostMapping(value = "import-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage importData(MultipartFile file, HttpServletRequest request) throws IOException { + public IJsonMessage importData(MultipartFile file, HttpServletRequest request) throws IOException { Assert.notNull(file, "没有上传文件"); String workspaceId = projectInfoCacheService.getCheckUserWorkspace(request); NodeModel node = getNode(); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/file/ProjectFileControl.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/file/ProjectFileControl.java index 423732fba..6808bc02f 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/file/ProjectFileControl.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/file/ProjectFileControl.java @@ -22,8 +22,9 @@ */ package org.dromara.jpom.controller.node.manage.file; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.controller.outgiving.OutGivingWhitelistService; @@ -75,7 +76,7 @@ public class ProjectFileControl extends BaseServerController { */ @RequestMapping(value = "upload-sharding", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.PROJECT_FILE, method = MethodFeature.UPLOAD, log = false) - public JsonMessage uploadSharding(String sliceId) { + public IJsonMessage uploadSharding(String sliceId) { Assert.state(BaseServerController.SHARDING_IDS.containsKey(sliceId), "不合法的分片id"); return NodeForward.requestMultipart(getNode(), getMultiRequest(), NodeUrl.Manage_File_Upload_Sharding); } @@ -87,7 +88,7 @@ public class ProjectFileControl extends BaseServerController { */ @RequestMapping(value = "sharding-merge", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.PROJECT_FILE, method = MethodFeature.UPLOAD) - public JsonMessage shardingMerge(String sliceId, HttpServletRequest request) { + public IJsonMessage shardingMerge(String sliceId, HttpServletRequest request) { Assert.state(BaseServerController.SHARDING_IDS.containsKey(sliceId), "不合法的分片id"); JsonMessage message = NodeForward.request(getNode(), request, NodeUrl.Manage_File_Sharding_Merge); // 判断-删除分片id diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/log/LogBackController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/log/LogBackController.java index 9f1984d3d..2a3f671ed 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/log/LogBackController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/manage/log/LogBackController.java @@ -22,9 +22,10 @@ */ package org.dromara.jpom.controller.node.manage.log; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.permission.ClassFeature; @@ -76,7 +77,7 @@ public class LogBackController extends BaseServerController { @RequestMapping(value = "log-back-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @Feature(method = MethodFeature.LIST) - public JsonMessage logBackList() { + public IJsonMessage logBackList() { JSONObject jsonObject = NodeForward.requestData(getNode(), NodeUrl.Manage_Log_logBack, getRequest(), JSONObject.class); return JsonMessage.success("success", jsonObject); } @@ -84,20 +85,20 @@ public class LogBackController extends BaseServerController { @RequestMapping(value = "logBack_download", method = RequestMethod.GET) @ResponseBody @Feature(method = MethodFeature.DOWNLOAD) - public void download(HttpServletResponse response) { - NodeForward.requestDownload(getNode(), getRequest(), response, NodeUrl.Manage_Log_logBack_download); + public void download(HttpServletResponse response, HttpServletRequest request) { + NodeForward.requestDownload(getNode(), request, response, NodeUrl.Manage_Log_logBack_download); } @RequestMapping(value = "logBack_delete", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @Feature(method = MethodFeature.DEL) - public String clear() { - return NodeForward.request(getNode(), getRequest(), NodeUrl.Manage_Log_logBack_delete).toString(); + public String clear(HttpServletRequest request) { + return NodeForward.request(getNode(), request, NodeUrl.Manage_Log_logBack_delete).toString(); } @RequestMapping(value = "logSize", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public JsonMessage logSize(String id, String copyId) { + public IJsonMessage logSize(String id, String copyId) { // JSONObject info = projectInfoCacheService.getLogSize(getNode(), id, copyId); return NodeForward.request(getNode(), NodeUrl.Manage_Log_LogSize, "id", id, "copyId", copyId); // return requestData.getData(); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptController.java index c4b4ba884..b4e15123b 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptController.java @@ -25,7 +25,12 @@ package org.dromara.jpom.controller.node.script; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; -import org.dromara.jpom.common.*; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.ServerOpenApi; +import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -75,7 +80,7 @@ public class NodeScriptController extends BaseServerController { * @author Hotstrip */ @RequestMapping(value = "list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> scriptList(HttpServletRequest request) { + public IJsonMessage> scriptList(HttpServletRequest request) { PageResultDto pageResultDto = nodeScriptServer.listPageNode(request); return JsonMessage.success("success", pageResultDto); } @@ -88,7 +93,7 @@ public class NodeScriptController extends BaseServerController { * @author Hotstrip */ @PostMapping(value = "list_all", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> listAll(HttpServletRequest request) { + public IJsonMessage> listAll(HttpServletRequest request) { PageResultDto modelPageResultDto = nodeScriptServer.listPage(request); return JsonMessage.success("", modelPageResultDto); } @@ -107,7 +112,7 @@ public class NodeScriptController extends BaseServerController { */ @RequestMapping(value = "save.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(String autoExecCron, HttpServletRequest request) { + public IJsonMessage save(String autoExecCron, HttpServletRequest request) { NodeModel node = getNode(); this.checkCron(autoExecCron); JsonMessage jsonMessage = NodeForward.request(node, request, NodeUrl.Script_Save, new String[]{}, "nodeId", node.getId()); @@ -119,7 +124,7 @@ public class NodeScriptController extends BaseServerController { @RequestMapping(value = "del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage del(@ValidatorItem String id, HttpServletRequest request) { NodeModel node = getNode(); JsonMessage requestData = NodeForward.request(node, request, NodeUrl.Script_Del); if (requestData.success()) { @@ -137,7 +142,7 @@ public class NodeScriptController extends BaseServerController { */ @GetMapping(value = "sync", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage syncProject(HttpServletRequest request) { + public IJsonMessage syncProject(HttpServletRequest request) { // NodeModel node = getNode(); int cache = nodeScriptServer.delCache(node.getId(), request); @@ -153,7 +158,7 @@ public class NodeScriptController extends BaseServerController { @GetMapping(value = "clear_all", produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission(superUser = true) @Feature(method = MethodFeature.DEL) - public JsonMessage clearAll() { + public IJsonMessage clearAll() { Entity where = Entity.create(); where.set("id", " <> id"); int del = nodeScriptServer.del(where); @@ -168,7 +173,7 @@ public class NodeScriptController extends BaseServerController { */ @RequestMapping(value = "trigger-url", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> getTriggerUrl(String id, String rest, HttpServletRequest request) { + public IJsonMessage> getTriggerUrl(String id, String rest, HttpServletRequest request) { NodeScriptCacheModel item = nodeScriptServer.getByKeyAndGlobal(id, request); UserModel user = getUser(); NodeScriptCacheModel updateInfo; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptLogController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptLogController.java index bcd700740..a80147db2 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/script/NodeScriptLogController.java @@ -24,8 +24,9 @@ package org.dromara.jpom.controller.node.script; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -65,7 +66,7 @@ public class NodeScriptLogController extends BaseServerController { * @return json */ @RequestMapping(value = "list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> scriptList() { + public IJsonMessage> scriptList() { PageResultDto pageResultDto = nodeScriptExecuteLogServer.listPageNode(getRequest()); return JsonMessage.success("", pageResultDto); } @@ -91,7 +92,7 @@ public class NodeScriptLogController extends BaseServerController { */ @RequestMapping(value = "del", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, String executeId, HttpServletRequest request) { + public IJsonMessage del(@ValidatorItem String id, String executeId, HttpServletRequest request) { NodeModel node = getNode(); NodeScriptExecuteLogCacheModel executeLogModel = nodeScriptExecuteLogServer.getByKey(executeId, request); Assert.notNull(executeLogModel, "没有对应的执行日志"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/system/WhitelistDirectoryController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/system/WhitelistDirectoryController.java index 46ee78fe6..4ec16b5f7 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/system/WhitelistDirectoryController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/system/WhitelistDirectoryController.java @@ -23,8 +23,9 @@ package org.dromara.jpom.controller.node.system; import cn.hutool.core.util.ReflectUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.func.assets.model.MachineNodeModel; import org.dromara.jpom.model.data.AgentWhitelist; @@ -73,7 +74,7 @@ public class WhitelistDirectoryController extends BaseServerController { */ @RequestMapping(value = "white-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission - public JsonMessage> whiteList(String machineId) { + public IJsonMessage> whiteList(String machineId) { NodeModel nodeModel = tryGetNode(); AgentWhitelist agentWhitelist; if (nodeModel != null) { @@ -110,7 +111,7 @@ public class WhitelistDirectoryController extends BaseServerController { */ @RequestMapping(value = "whitelistDirectory_submit", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission - public JsonMessage whitelistDirectorySubmit(HttpServletRequest request, String machineId) { + public IJsonMessage whitelistDirectorySubmit(HttpServletRequest request, String machineId) { JsonMessage objectJsonMessage = this.tryRequestNode(machineId, request, NodeUrl.WhitelistDirectory_Submit); Assert.notNull(objectJsonMessage, "请选择节点"); return objectJsonMessage; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/node/system/nginx/NginxController.java b/modules/server/src/main/java/org/dromara/jpom/controller/node/system/nginx/NginxController.java index 703ea0669..15b910d84 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/node/system/nginx/NginxController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/node/system/nginx/NginxController.java @@ -22,9 +22,10 @@ */ package org.dromara.jpom.controller.node.system.nginx; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.permission.ClassFeature; @@ -90,7 +91,7 @@ public class NginxController extends BaseServerController { */ @RequestMapping(value = "white-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public JsonMessage> loadWhiteList() { + public IJsonMessage> loadWhiteList() { List list = whitelistDirectoryService.getNgxDirectory(getNode()); return JsonMessage.success("success", list); } @@ -102,7 +103,7 @@ public class NginxController extends BaseServerController { */ @RequestMapping(value = "load-config", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public JsonMessage loadConfig() { + public IJsonMessage loadConfig() { JSONObject data = NodeForward.requestData(getNode(), NodeUrl.System_Nginx_item_data, getRequest(), JSONObject.class); return JsonMessage.success("success", data); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/LogReadController.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/LogReadController.java index 7da83ce14..9eab7f50e 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/LogReadController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/LogReadController.java @@ -23,10 +23,11 @@ package org.dromara.jpom.controller.outgiving; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.outgiving.LogReadModel; import org.dromara.jpom.permission.ClassFeature; @@ -65,7 +66,7 @@ public class LogReadController extends BaseServerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list() { + public IJsonMessage> list() { PageResultDto pageResultDto = logReadServer.listPage(getRequest()); return JsonMessage.success("success", pageResultDto); } @@ -78,7 +79,7 @@ public class LogReadController extends BaseServerController { */ @RequestMapping(value = "del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(String id) { + public IJsonMessage del(String id) { HttpServletRequest request = getRequest(); int byKey = logReadServer.delByKey(id, request); return JsonMessage.success("操作成功"); @@ -94,7 +95,7 @@ public class LogReadController extends BaseServerController { */ @RequestMapping(value = "save.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(@RequestBody JSONObject jsonObject) { + public IJsonMessage save(@RequestBody JSONObject jsonObject) { Assert.notNull(jsonObject, "请传入参数"); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); @@ -135,7 +136,7 @@ public class LogReadController extends BaseServerController { */ @RequestMapping(value = "update-cache.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage updateCache(@RequestBody JSONObject jsonObject) { + public IJsonMessage updateCache(@RequestBody JSONObject jsonObject) { Assert.notNull(jsonObject, "请传入参数"); String id = jsonObject.getString("id"); Assert.hasText(id, "请传入参数"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingController.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingController.java index fe01465c9..75bf28a5a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingController.java @@ -30,10 +30,11 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -96,7 +97,7 @@ public class OutGivingController extends BaseServerController { */ @PostMapping(value = "dispatch-list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> dispatchList(HttpServletRequest request) { + public IJsonMessage> dispatchList(HttpServletRequest request) { PageResultDto pageResultDto = outGivingServer.listPage(request); return JsonMessage.success("success", pageResultDto); } @@ -110,7 +111,7 @@ public class OutGivingController extends BaseServerController { */ @GetMapping(value = "dispatch-list-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> dispatchListAll(HttpServletRequest request) { + public IJsonMessage> dispatchListAll(HttpServletRequest request) { List outGivingModels = outGivingServer.listByWorkspace(request); return JsonMessage.success("", outGivingModels); } @@ -118,7 +119,7 @@ public class OutGivingController extends BaseServerController { @RequestMapping(value = "save", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(String type, @ValidatorItem String id, HttpServletRequest request) throws IOException { + public IJsonMessage save(String type, @ValidatorItem String id, HttpServletRequest request) throws IOException { if ("add".equalsIgnoreCase(type)) { // String checkId = StrUtil.replace(id, StrUtil.DASHED, StrUtil.UNDERLINE); @@ -131,7 +132,7 @@ public class OutGivingController extends BaseServerController { } } - private JsonMessage addOutGiving(String id, HttpServletRequest request) { + private IJsonMessage addOutGiving(String id, HttpServletRequest request) { OutGivingModel outGivingModel = outGivingServer.getByKey(id); Assert.isNull(outGivingModel, "分发id已经存在啦,分发id需要全局唯一"); // @@ -143,7 +144,7 @@ public class OutGivingController extends BaseServerController { return JsonMessage.success("添加成功"); } - private JsonMessage updateGiving(String id, HttpServletRequest request) { + private IJsonMessage updateGiving(String id, HttpServletRequest request) { OutGivingModel outGivingModel = outGivingServer.getByKey(id, request); Assert.notNull(outGivingModel, "没有找到对应的分发id"); doData(outGivingModel, request); @@ -231,7 +232,7 @@ public class OutGivingController extends BaseServerController { */ @RequestMapping(value = "release_del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage releaseDel(String id, HttpServletRequest request) { + public IJsonMessage releaseDel(String id, HttpServletRequest request) { // 判断构建 boolean releaseMethod = buildService.checkReleaseMethod(id, request, BuildReleaseMethod.Outgiving); Assert.state(!releaseMethod, "当前分发存在构建项,不能删除"); @@ -268,7 +269,7 @@ public class OutGivingController extends BaseServerController { */ @GetMapping(value = "unbind.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage unbind(String id, HttpServletRequest request) { + public IJsonMessage unbind(String id, HttpServletRequest request) { OutGivingModel outGivingServerItem = outGivingServer.getByKey(id, request); Assert.notNull(outGivingServerItem, "对应的分发不存在"); // 判断构建 diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingLogController.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingLogController.java index 978e27e55..49f604ee5 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingLogController.java @@ -22,8 +22,9 @@ */ package org.dromara.jpom.controller.outgiving; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.log.OutGivingLog; import org.dromara.jpom.permission.ClassFeature; @@ -55,7 +56,7 @@ public class OutGivingLogController extends BaseServerController { @RequestMapping(value = "log_list_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listData() { + public IJsonMessage> listData() { PageResultDto pageResult = dbOutGivingLogService.listPage(getRequest()); return JsonMessage.success("获取成功", pageResult); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectController.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectController.java index bc2d9520b..af627730c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectController.java @@ -28,17 +28,18 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.BaseIdModel; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.AfterOpt; import org.dromara.jpom.model.BaseEnum; -import org.dromara.jpom.model.BaseIdModel; import org.dromara.jpom.model.BaseNodeModel; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.data.ServerWhitelist; @@ -102,8 +103,8 @@ public class OutGivingProjectController extends BaseServerController { } @RequestMapping(value = "getItemData.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage getItemData(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "id error") String id, - HttpServletRequest request) { + public IJsonMessage getItemData(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "id error") String id, + HttpServletRequest request) { String workspaceId = outGivingServer.getCheckUserWorkspace(request); OutGivingModel outGivingServerItem = outGivingServer.getByKey(id, request); Objects.requireNonNull(outGivingServerItem, "没有数据"); @@ -119,33 +120,33 @@ public class OutGivingProjectController extends BaseServerController { List collect = outGivingNodeProjectList - .stream() - .map(outGivingNodeProject -> { - NodeModel nodeModel = nodeMap.get(outGivingNodeProject.getNodeId()); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("sortValue", outGivingNodeProject.getSortValue()); - jsonObject.put("disabled", outGivingNodeProject.getDisabled()); - jsonObject.put("nodeId", outGivingNodeProject.getNodeId()); - jsonObject.put("projectId", outGivingNodeProject.getProjectId()); - jsonObject.put("nodeName", nodeModel.getName()); - String fullId = BaseNodeModel.fullId(workspaceId, outGivingNodeProject.getNodeId(), outGivingNodeProject.getProjectId()); - jsonObject.put("id", fullId); - ProjectInfoCacheModel projectInfoCacheModel = projectMap.get(fullId); - if (projectInfoCacheModel != null) { - jsonObject.put("cacheProjectName", projectInfoCacheModel.getName()); - } + .stream() + .map(outGivingNodeProject -> { + NodeModel nodeModel = nodeMap.get(outGivingNodeProject.getNodeId()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("sortValue", outGivingNodeProject.getSortValue()); + jsonObject.put("disabled", outGivingNodeProject.getDisabled()); + jsonObject.put("nodeId", outGivingNodeProject.getNodeId()); + jsonObject.put("projectId", outGivingNodeProject.getProjectId()); + jsonObject.put("nodeName", nodeModel.getName()); + String fullId = BaseNodeModel.fullId(workspaceId, outGivingNodeProject.getNodeId(), outGivingNodeProject.getProjectId()); + jsonObject.put("id", fullId); + ProjectInfoCacheModel projectInfoCacheModel = projectMap.get(fullId); + if (projectInfoCacheModel != null) { + jsonObject.put("cacheProjectName", projectInfoCacheModel.getName()); + } - OutGivingLog outGivingLog = dbOutGivingLogService.getByProject(id, outGivingNodeProject); - if (outGivingLog != null) { - jsonObject.put("outGivingStatus", outGivingLog.getStatus()); - jsonObject.put("outGivingResult", outGivingLog.getResult()); - jsonObject.put("lastTime", outGivingLog.getCreateTimeMillis()); - jsonObject.put("fileSize", outGivingLog.getFileSize()); - jsonObject.put("progressSize", outGivingLog.getProgressSize()); - } - return jsonObject; - }) - .collect(Collectors.toList()); + OutGivingLog outGivingLog = dbOutGivingLogService.getByProject(id, outGivingNodeProject); + if (outGivingLog != null) { + jsonObject.put("outGivingStatus", outGivingLog.getStatus()); + jsonObject.put("outGivingResult", outGivingLog.getResult()); + jsonObject.put("lastTime", outGivingLog.getCreateTimeMillis()); + jsonObject.put("fileSize", outGivingLog.getFileSize()); + jsonObject.put("progressSize", outGivingLog.getProgressSize()); + } + return jsonObject; + }) + .collect(Collectors.toList()); JSONObject data = new JSONObject(); data.put("data", outGivingServerItem); data.put("projectList", collect); @@ -175,7 +176,7 @@ public class OutGivingProjectController extends BaseServerController { */ @RequestMapping(value = "upload-sharding", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD, log = false) - public JsonMessage uploadSharding(String id, + public IJsonMessage uploadSharding(String id, MultipartFile file, String sliceId, Integer totalSlice, @@ -201,7 +202,7 @@ public class OutGivingProjectController extends BaseServerController { */ @RequestMapping(value = "upload-sharding-merge", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage upload(String id, String afterOpt, String clearOld, String autoUnzip, + public IJsonMessage upload(String id, String afterOpt, String clearOld, String autoUnzip, String secondaryDirectory, String stripComponents, String selectProject, String sliceId, @@ -232,11 +233,11 @@ public class OutGivingProjectController extends BaseServerController { int stripComponentsValue = Convert.toInt(stripComponents, 0); // 开启 OutGivingRun.OutGivingRunBuilder outGivingRunBuilder = OutGivingRun.builder() - .id(outGivingModel.getId()) - .file(dest) - .userModel(getUser()) - .unzip(unzip) - .stripComponents(stripComponentsValue); + .id(outGivingModel.getId()) + .file(dest) + .userModel(getUser()) + .unzip(unzip) + .stripComponents(stripComponentsValue); outGivingRunBuilder.build().startRun(selectProject); return JsonMessage.success("上传成功,开始分发!"); } @@ -261,7 +262,7 @@ public class OutGivingProjectController extends BaseServerController { */ @PostMapping(value = "remote_download", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.REMOTE_DOWNLOAD) - public JsonMessage remoteDownload(String id, String afterOpt, String clearOld, String url, String autoUnzip, + public IJsonMessage remoteDownload(String id, String afterOpt, String clearOld, String url, String autoUnzip, String secondaryDirectory, String stripComponents, String selectProject, @@ -288,18 +289,18 @@ public class OutGivingProjectController extends BaseServerController { int stripComponentsValue = Convert.toInt(stripComponents, 0); // 开启 OutGivingRun.OutGivingRunBuilder outGivingRunBuilder = OutGivingRun.builder() - .id(outGivingModel.getId()) - .file(downloadFile) - .userModel(getUser()) - .unzip(unzip) - .stripComponents(stripComponentsValue); + .id(outGivingModel.getId()) + .file(downloadFile) + .userModel(getUser()) + .unzip(unzip) + .stripComponents(stripComponentsValue); outGivingRunBuilder.build().startRun(selectProject); return JsonMessage.success("下载成功,开始分发!"); } @PostMapping(value = "cancel", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage cancel(@ValidatorItem String id) { + public IJsonMessage cancel(@ValidatorItem String id) { OutGivingModel outGivingModel = this.check(id, (status, outGivingModel1) -> Assert.state(status == OutGivingModel.Status.ING, "当前状态不是分发中")); OutGivingRun.cancel(outGivingModel.getId(), getUser()); // @@ -308,7 +309,7 @@ public class OutGivingProjectController extends BaseServerController { @PostMapping(value = "config-project", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage configProject(@RequestBody JSONObject jsonObject, HttpServletRequest request) { + public IJsonMessage configProject(@RequestBody JSONObject jsonObject, HttpServletRequest request) { Assert.notNull(jsonObject, "没有任何信息"); String id = jsonObject.getString("id"); List list = jsonObject.getList("data", OutGivingNodeProject.class); @@ -334,7 +335,7 @@ public class OutGivingProjectController extends BaseServerController { @GetMapping(value = "remove-project", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage removeProject(@ValidatorItem String id, + public IJsonMessage removeProject(@ValidatorItem String id, @ValidatorItem String nodeId, @ValidatorItem String projectId, HttpServletRequest request) { @@ -345,8 +346,8 @@ public class OutGivingProjectController extends BaseServerController { // Assert.state(outGivingNodeProjects.size() > 1, "当前分发只有一个项目啦,删除整个分发即可"); outGivingNodeProjects = outGivingNodeProjects.stream() - .filter(nodeProject -> !StrUtil.equals(nodeProject.getProjectId(), projectId) || !StrUtil.equals(nodeProject.getNodeId(), nodeId)) - .collect(Collectors.toList()); + .filter(nodeProject -> !StrUtil.equals(nodeProject.getProjectId(), projectId) || !StrUtil.equals(nodeProject.getNodeId(), nodeId)) + .collect(Collectors.toList()); // 更新 OutGivingModel update = new OutGivingModel(); update.setId(outGivingModel.getId()); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectEditController.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectEditController.java index fb1136da7..6d531bd36 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectEditController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingProjectEditController.java @@ -30,11 +30,13 @@ import cn.hutool.core.lang.Tuple; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -52,6 +54,7 @@ import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; import org.dromara.jpom.service.dblog.BuildInfoService; import org.dromara.jpom.service.node.ProjectInfoCacheService; +import org.dromara.jpom.service.outgiving.DbOutGivingLogService; import org.dromara.jpom.service.outgiving.OutGivingServer; import org.springframework.http.MediaType; import org.springframework.util.Assert; @@ -80,15 +83,18 @@ public class OutGivingProjectEditController extends BaseServerController { private final OutGivingServer outGivingServer; private final ProjectInfoCacheService projectInfoCacheService; private final BuildInfoService buildService; + private final DbOutGivingLogService dbOutGivingLogService; public OutGivingProjectEditController(OutGivingWhitelistService outGivingWhitelistService, OutGivingServer outGivingServer, ProjectInfoCacheService projectInfoCacheService, - BuildInfoService buildService) { + BuildInfoService buildService, + DbOutGivingLogService dbOutGivingLogService) { this.outGivingWhitelistService = outGivingWhitelistService; this.outGivingServer = outGivingServer; this.projectInfoCacheService = projectInfoCacheService; this.buildService = buildService; + this.dbOutGivingLogService = dbOutGivingLogService; } /** @@ -100,7 +106,7 @@ public class OutGivingProjectEditController extends BaseServerController { */ @RequestMapping(value = "save_project", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(@ValidatorItem String id, String type) { + public IJsonMessage save(@ValidatorItem String id, String type) { if ("add".equalsIgnoreCase(type)) { //boolean general = StringUtil.isGeneral(id, 2, 20); //Assert.state(general, "分发id 不能为空并且长度在2-20(英文字母 、数字和下划线)"); @@ -120,7 +126,7 @@ public class OutGivingProjectEditController extends BaseServerController { */ @RequestMapping(value = "delete_project", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(String id, String thorough) { + public IJsonMessage delete(String id, String thorough) { HttpServletRequest request = getRequest(); OutGivingModel outGivingModel = outGivingServer.getByKey(id, request); Assert.notNull(outGivingModel, "没有对应的分发项目"); @@ -143,11 +149,17 @@ public class OutGivingProjectEditController extends BaseServerController { } } - outGivingServer.delByKey(id, request); + int byKey = outGivingServer.delByKey(id, request); + // 删除日志 + if (byKey > 0) { + Entity where = new Entity(); + where.set("outGivingId", id); + dbOutGivingLogService.del(where); + } return JsonMessage.success("删除成功"); } - private JsonMessage addOutGiving(String id) { + private IJsonMessage addOutGiving(String id) { OutGivingModel outGivingModel = outGivingServer.getByKey(id); Assert.isNull(outGivingModel, "分发id已经存在啦"); @@ -158,18 +170,18 @@ public class OutGivingProjectEditController extends BaseServerController { List tuples = doData(outGivingModel, false); outGivingServer.insert(outGivingModel); - JsonMessage error = saveNodeData(outGivingModel, tuples, false); + IJsonMessage error = saveNodeData(outGivingModel, tuples, false); return Optional.ofNullable(error).orElseGet(() -> JsonMessage.success("添加成功")); } - private JsonMessage updateGiving(String id) { + private IJsonMessage updateGiving(String id) { OutGivingModel outGivingModel = outGivingServer.getByKey(id, getRequest()); Assert.notNull(outGivingModel, "没有找到对应的分发id"); List tuples = doData(outGivingModel, true); outGivingServer.updateById(outGivingModel); - JsonMessage error = saveNodeData(outGivingModel, tuples, true); + IJsonMessage error = saveNodeData(outGivingModel, tuples, true); return Optional.ofNullable(error).orElseGet(() -> JsonMessage.success("修改成功")); } @@ -406,11 +418,11 @@ public class OutGivingProjectEditController extends BaseServerController { // String webhook = getParameter("webhook"); webhook = Opt.ofBlankAble(webhook) - .map(s -> { - Validator.validateMatchRegex(RegexPool.URL_HTTP, s, "WebHooks 地址不合法"); - return s; - }) - .orElse(StrUtil.EMPTY); + .map(s -> { + Validator.validateMatchRegex(RegexPool.URL_HTTP, s, "WebHooks 地址不合法"); + return s; + }) + .orElse(StrUtil.EMPTY); outGivingModel.setWebhook(webhook); return tuples; } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistController.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistController.java index e2a09c139..f49ea7da3 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistController.java @@ -26,8 +26,10 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.RegexPool; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.ReflectUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; +import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.data.AgentWhitelist; import org.dromara.jpom.model.data.ServerWhitelist; import org.dromara.jpom.permission.ClassFeature; @@ -77,8 +79,8 @@ public class OutGivingWhitelistController extends BaseServerController { * @author Hotstrip */ @RequestMapping(value = "white-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> whiteList() { - ServerWhitelist serverWhitelist = outGivingWhitelistService.getServerWhitelistData(getRequest()); + public IJsonMessage> whiteList(HttpServletRequest request) { + ServerWhitelist serverWhitelist = outGivingWhitelistService.getServerWhitelistData(request); Field[] fields = ReflectUtil.getFields(ServerWhitelist.class); Map map = new HashMap<>(8); for (Field field : fields) { @@ -102,13 +104,36 @@ public class OutGivingWhitelistController extends BaseServerController { @RequestMapping(value = "whitelistDirectory_submit", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @SystemPermission @Feature(method = MethodFeature.EDIT) - public JsonMessage whitelistDirectorySubmit(String outGiving, + public IJsonMessage whitelistDirectorySubmit(String outGiving, String allowRemoteDownloadHost, HttpServletRequest request) { + String workspaceId = nodeService.getCheckUserWorkspace(request); + return this.whitelistDirectorySubmit(outGiving, allowRemoteDownloadHost, workspaceId); + } + + /** + * 保存节点白名单 + * + * @param outGiving 数据 + * @return json + */ + @RequestMapping(value = "whitelist-directory-submit2", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + @SystemPermission + @Feature(method = MethodFeature.EDIT) + public IJsonMessage whitelistDirectorySubmit2(String outGiving, + String allowRemoteDownloadHost, + @ValidatorItem String workspaceId) { + nodeService.checkUserWorkspace(workspaceId); + return this.whitelistDirectorySubmit(outGiving, allowRemoteDownloadHost, workspaceId); + } + + private IJsonMessage whitelistDirectorySubmit(String outGiving, + String allowRemoteDownloadHost, + String workspaceId) { List list = AgentWhitelist.parseToList(outGiving, true, "项目路径白名单不能为空"); list = AgentWhitelist.covertToArray(list, "项目路径白名单不能位于Jpom目录下"); - ServerWhitelist serverWhitelist = outGivingWhitelistService.getServerWhitelistData(request); + ServerWhitelist serverWhitelist = outGivingWhitelistService.getServerWhitelistData(workspaceId); serverWhitelist.setOutGiving(list); // List allowRemoteDownloadHostList = AgentWhitelist.parseToList(allowRemoteDownloadHost, "运行远程下载的 host 不能配置为空"); @@ -120,7 +145,7 @@ public class OutGivingWhitelistController extends BaseServerController { } serverWhitelist.setAllowRemoteDownloadHost(allowRemoteDownloadHostList == null ? null : CollUtil.newHashSet(allowRemoteDownloadHostList)); // - String workspaceId = nodeService.getCheckUserWorkspace(request); + String id = ServerWhitelist.workspaceId(workspaceId); systemParametersServer.upsert(id, serverWhitelist, id); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistService.java b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistService.java index 5afc63568..88f496363 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistService.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/outgiving/OutGivingWhitelistService.java @@ -48,6 +48,10 @@ public class OutGivingWhitelistService { public ServerWhitelist getServerWhitelistData(HttpServletRequest request) { String workspaceId = nodeService.getCheckUserWorkspace(request); + return this.getServerWhitelistData(workspaceId); + } + + public ServerWhitelist getServerWhitelistData(String workspaceId) { String id = ServerWhitelist.workspaceId(workspaceId); ServerWhitelist serverWhitelist = systemParametersServer.getConfigDefNewInstance(id, ServerWhitelist.class); if (serverWhitelist == null) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptController.java b/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptController.java index f8ca34c5d..b6b1dc925 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptController.java @@ -25,8 +25,13 @@ package org.dromara.jpom.controller.script; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.*; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.ServerOpenApi; +import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -91,7 +96,7 @@ public class ScriptController extends BaseServerController { */ @RequestMapping(value = "list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> scriptList() { + public IJsonMessage> scriptList() { PageResultDto pageResultDto = scriptServer.listPage(getRequest()); return JsonMessage.success("success", pageResultDto); } @@ -103,14 +108,14 @@ public class ScriptController extends BaseServerController { */ @GetMapping(value = "list-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> scriptListAll(HttpServletRequest request) { + public IJsonMessage> scriptListAll(HttpServletRequest request) { List pageResultDto = scriptServer.listByWorkspace(request); return JsonMessage.success("success", pageResultDto); } @RequestMapping(value = "save.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(String id, + public IJsonMessage save(String id, @ValidatorItem String context, @ValidatorItem String name, String autoExecCron, @@ -184,7 +189,7 @@ public class ScriptController extends BaseServerController { @RequestMapping(value = "del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(String id, HttpServletRequest request) { + public IJsonMessage del(String id, HttpServletRequest request) { ScriptModel server = scriptServer.getByKeyAndGlobal(id, request); if (server != null) { File file = server.scriptPath(); @@ -203,7 +208,7 @@ public class ScriptController extends BaseServerController { @GetMapping(value = "get", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage get(String id, HttpServletRequest request) { + public IJsonMessage get(String id, HttpServletRequest request) { String workspaceId = scriptServer.getCheckUserWorkspace(request); ScriptModel server = scriptServer.getByKeyAndGlobal(id, request); Assert.notNull(server, "没有对应的脚本"); @@ -246,7 +251,7 @@ public class ScriptController extends BaseServerController { @RequestMapping(value = "unbind.json", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) @SystemPermission - public JsonMessage unbind(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage unbind(@ValidatorItem String id, HttpServletRequest request) { ScriptModel update = new ScriptModel(); update.setId(id); update.setNodeIds(StrUtil.EMPTY); @@ -264,7 +269,7 @@ public class ScriptController extends BaseServerController { @GetMapping(value = "sync-to-workspace", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission() - public JsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { + public IJsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { String nowWorkspaceId = nodeService.getCheckUserWorkspace(getRequest()); // scriptServer.checkUserWorkspace(toWorkspaceId); @@ -280,7 +285,7 @@ public class ScriptController extends BaseServerController { */ @RequestMapping(value = "trigger-url", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> getTriggerUrl(String id, String rest, HttpServletRequest request) { + public IJsonMessage> getTriggerUrl(String id, String rest, HttpServletRequest request) { ScriptModel item = scriptServer.getByKey(id, request); UserModel user = getUser(); ScriptModel updateInfo; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptLogController.java b/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptLogController.java index e301b1127..8185247f1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/script/ScriptLogController.java @@ -23,9 +23,10 @@ package org.dromara.jpom.controller.script; import cn.hutool.core.io.FileUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.PageResultDto; @@ -74,7 +75,7 @@ public class ScriptLogController extends BaseServerController { */ @RequestMapping(value = "list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> scriptList(HttpServletRequest request) { + public IJsonMessage> scriptList(HttpServletRequest request) { PageResultDto pageResultDto = scriptExecuteLogServer.listPage(request); return JsonMessage.success("success", pageResultDto); } @@ -88,7 +89,7 @@ public class ScriptLogController extends BaseServerController { */ @RequestMapping(value = "del_log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delLog(@ValidatorItem() String id, + public IJsonMessage delLog(@ValidatorItem() String id, @ValidatorItem() String executeId, HttpServletRequest request) { ScriptModel item = scriptServer.getByKeyAndGlobal(id, request); @@ -110,7 +111,7 @@ public class ScriptLogController extends BaseServerController { */ @RequestMapping(value = "log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getNowLog(@ValidatorItem() String id, + public IJsonMessage getNowLog(@ValidatorItem() String id, @ValidatorItem() String executeId, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line, HttpServletRequest request) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandInfoController.java index bea12374c..54f05f90a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandInfoController.java @@ -24,8 +24,13 @@ package org.dromara.jpom.controller.ssh; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.*; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.ServerOpenApi; +import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.PageResultDto; @@ -81,7 +86,7 @@ public class CommandInfoController extends BaseServerController { */ @RequestMapping(value = "list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> page() { + public IJsonMessage> page() { PageResultDto page = commandService.listPage(getRequest()); return JsonMessage.success("", page); } @@ -104,7 +109,7 @@ public class CommandInfoController extends BaseServerController { */ @RequestMapping(value = "edit", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(@RequestBody JSONObject data, HttpServletRequest request) { + public IJsonMessage edit(@RequestBody JSONObject data, HttpServletRequest request) { String name = data.getString("name"); String command = data.getString("command"); String desc = data.getString("desc"); @@ -144,7 +149,7 @@ public class CommandInfoController extends BaseServerController { */ @RequestMapping(value = "del", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(String id) { + public IJsonMessage del(String id) { File logFileDir = CommandExecLogModel.logFileDir(id); boolean fastDel = CommandUtil.systemFastDel(logFileDir); Assert.state(!fastDel, "清理日志文件失败"); @@ -169,7 +174,7 @@ public class CommandInfoController extends BaseServerController { */ @RequestMapping(value = "batch", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage batch(String id, + public IJsonMessage batch(String id, String params, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "运行节点不能为空") String nodes) throws IOException { Assert.hasText(id, "请选择执行的命令"); @@ -188,7 +193,7 @@ public class CommandInfoController extends BaseServerController { @GetMapping(value = "sync-to-workspace", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission() - public JsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { + public IJsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId) { String nowWorkspaceId = nodeService.getCheckUserWorkspace(getRequest()); // commandService.checkUserWorkspace(toWorkspaceId); @@ -204,7 +209,7 @@ public class CommandInfoController extends BaseServerController { */ @RequestMapping(value = "trigger-url", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> getTriggerUrl(String id, String rest) { + public IJsonMessage> getTriggerUrl(String id, String rest) { CommandModel item = commandService.getByKey(id, getRequest()); UserModel user = getUser(); CommandModel updateInfo; diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandLogController.java b/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandLogController.java index 3fb41f853..ecb1fc9da 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/ssh/CommandLogController.java @@ -24,9 +24,10 @@ package org.dromara.jpom.controller.ssh; import cn.hutool.core.io.FileUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.PageResultDto; @@ -69,7 +70,7 @@ public class CommandLogController extends BaseServerController { */ @RequestMapping(value = "list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> page() { + public IJsonMessage> page() { PageResultDto page = commandExecLogService.listPage(getRequest()); return JsonMessage.success("", page); } @@ -86,7 +87,7 @@ public class CommandLogController extends BaseServerController { */ @RequestMapping(value = "del", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(String id) { + public IJsonMessage del(String id) { CommandExecLogModel execLogModel = commandExecLogService.getByKey(id); Assert.notNull(execLogModel, "没有对应的记录"); File logFile = execLogModel.logFile(); @@ -121,7 +122,7 @@ public class CommandLogController extends BaseServerController { */ @GetMapping(value = "batch_list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> batchList(@ValidatorItem String commandId, @ValidatorItem String batchId) { + public IJsonMessage> batchList(@ValidatorItem String commandId, @ValidatorItem String batchId) { CommandExecLogModel commandExecLogModel = new CommandExecLogModel(); commandExecLogModel.setCommandId(commandId); commandExecLogModel.setBatchId(batchId); @@ -145,7 +146,7 @@ public class CommandLogController extends BaseServerController { */ @RequestMapping(value = "log", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage log(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, + public IJsonMessage log(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line) { CommandExecLogModel item = commandExecLogService.getByKey(id, getRequest()); Assert.notNull(item, "没有对应数据"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/ssh/SshController.java b/modules/server/src/main/java/org/dromara/jpom/controller/ssh/SshController.java index 9a074ebb8..9cb4f2845 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/ssh/SshController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/ssh/SshController.java @@ -23,9 +23,10 @@ package org.dromara.jpom.controller.ssh; import cn.hutool.core.collection.CollUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.func.assets.server.MachineSshServer; @@ -79,7 +80,7 @@ public class SshController extends BaseServerController { @PostMapping(value = "list_data.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listData(HttpServletRequest request) { + public IJsonMessage> listData(HttpServletRequest request) { PageResultDto pageResultDto = sshService.listPage(request); pageResultDto.each(sshModel -> { sshModel.setMachineSsh(machineSshServer.getByKey(sshModel.getMachineSshId())); @@ -91,14 +92,14 @@ public class SshController extends BaseServerController { @GetMapping(value = "list_data_all.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listDataAll(HttpServletRequest request) { + public IJsonMessage> listDataAll(HttpServletRequest request) { List list = sshService.listByWorkspace(request); return new JsonMessage<>(200, "", list); } @GetMapping(value = "get-item.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getItem(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage getItem(@ValidatorItem String id, HttpServletRequest request) { SshModel byKey = sshService.getByKey(id, request); Assert.notNull(byKey, "对应的 ssh 不存在"); return new JsonMessage<>(200, "", byKey); @@ -111,7 +112,7 @@ public class SshController extends BaseServerController { */ @GetMapping(value = "list-group-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listGroupAll(HttpServletRequest request) { + public IJsonMessage> listGroupAll(HttpServletRequest request) { List listGroup = sshService.listGroup(request); return JsonMessage.success("", listGroup); } @@ -127,7 +128,7 @@ public class SshController extends BaseServerController { */ @PostMapping(value = "save.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "ssh名称不能为空") String name, + public IJsonMessage save(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "ssh名称不能为空") String name, String id, String group, HttpServletRequest request) { @@ -142,7 +143,7 @@ public class SshController extends BaseServerController { @PostMapping(value = "del.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem(value = ValidatorRule.NOT_BLANK) String id, HttpServletRequest request) { + public IJsonMessage del(@ValidatorItem(value = ValidatorRule.NOT_BLANK) String id, HttpServletRequest request) { boolean checkSsh = buildInfoService.checkReleaseMethodByLike(id, request, BuildReleaseMethod.Ssh); Assert.state(!checkSsh, "当前ssh存在构建项,不能删除"); // 判断是否绑定节点 @@ -158,7 +159,7 @@ public class SshController extends BaseServerController { @PostMapping(value = "del-fore", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) @SystemPermission - public JsonMessage delFore(@ValidatorItem(value = ValidatorRule.NOT_BLANK) String id) { + public IJsonMessage delFore(@ValidatorItem(value = ValidatorRule.NOT_BLANK) String id) { boolean checkSsh = buildInfoService.checkReleaseMethodByLike(id, BuildReleaseMethod.Ssh); Assert.state(!checkSsh, "当前ssh存在构建项,不能删除"); // 判断是否绑定节点 @@ -178,7 +179,7 @@ public class SshController extends BaseServerController { */ @PostMapping(value = "log_list_data.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.SSH_TERMINAL_LOG, method = MethodFeature.LIST) - public JsonMessage> logListData(HttpServletRequest request) { + public IJsonMessage> logListData(HttpServletRequest request) { PageResultDto pageResult = sshTerminalExecuteLogService.listPage(request); return JsonMessage.success("获取成功", pageResult); } @@ -193,7 +194,7 @@ public class SshController extends BaseServerController { @GetMapping(value = "sync-to-workspace", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission() - public JsonMessage syncToWorkspace(@ValidatorItem String ids, + public IJsonMessage syncToWorkspace(@ValidatorItem String ids, @ValidatorItem String toWorkspaceId, HttpServletRequest request) { String nowWorkspaceId = nodeService.getCheckUserWorkspace(request); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/BackupInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/BackupInfoController.java index 10c7300f9..e6bb6b1f9 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/BackupInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/BackupInfoController.java @@ -31,11 +31,12 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.ContentType; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.db.DbExtConfig; @@ -112,7 +113,7 @@ public class BackupInfoController extends BaseServerController { @PostMapping(value = "/system/backup/delete") @Feature(method = MethodFeature.DEL) @SystemPermission(superUser = true) - public JsonMessage deleteBackup(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { + public IJsonMessage deleteBackup(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { // 删除备份信息 backupInfoService.delByKey(id); return new JsonMessage<>(200, "删除成功"); @@ -127,7 +128,7 @@ public class BackupInfoController extends BaseServerController { */ @PostMapping(value = "/system/backup/restore") @Feature(method = MethodFeature.EXECUTE) - public JsonMessage restoreBackup(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { + public IJsonMessage restoreBackup(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { // 根据 id 查询备份信息 BackupInfoModel backupInfoModel = backupInfoService.getByKey(id); Objects.requireNonNull(backupInfoModel, "备份数据不存在"); @@ -188,7 +189,7 @@ public class BackupInfoController extends BaseServerController { */ @PostMapping(value = "/system/backup/create") @Feature(method = MethodFeature.EDIT) - public JsonMessage backup(@RequestBody Map map) { + public IJsonMessage backup(@RequestBody Map map) { List tableNameList = JSON.parseArray(JSON.toJSONString(map.get("tableNameList")), String.class); backupInfoService.backupToSql(tableNameList); return new JsonMessage<>(200, "操作成功,请稍后刷新查看备份状态"); @@ -202,7 +203,7 @@ public class BackupInfoController extends BaseServerController { @PostMapping(value = "/system/backup/upload") @Feature(method = MethodFeature.UPLOAD) @SystemPermission(superUser = true) - public JsonMessage uploadBackupFile(MultipartFile file) throws IOException { + public IJsonMessage uploadBackupFile(MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); String extName = FileUtil.extName(originalFilename); Assert.state(StrUtil.containsAnyIgnoreCase(extName, "sql"), "不支持的文件类型:" + extName); @@ -269,7 +270,7 @@ public class BackupInfoController extends BaseServerController { */ @PostMapping(value = "/system/backup/table-name-list") @Feature(method = MethodFeature.LIST) - public JsonMessage> loadTableNameList() { + public IJsonMessage> loadTableNameList() { // 从数据库加载表名称列表 List tableNameList = backupInfoService.h2TableNameList(); // 扫描程序,拿到表名称和别名 diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/CacheManageController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/CacheManageController.java index 2b14a89fd..c5bb68094 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/CacheManageController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/CacheManageController.java @@ -22,15 +22,19 @@ */ package org.dromara.jpom.controller.system; +import cn.hutool.cache.impl.CacheObj; +import cn.hutool.cache.impl.LFUCache; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.io.FileUtil; +import cn.keepbx.jpom.IJsonMessage; import cn.keepbx.jpom.event.ICacheTask; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.JpomApplication; -import org.dromara.jpom.build.BuildInfoManage; +import org.dromara.jpom.build.BuildExecuteManage; import org.dromara.jpom.build.BuildUtil; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.JpomManifest; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -43,6 +47,7 @@ import org.dromara.jpom.permission.MethodFeature; import org.dromara.jpom.permission.SystemPermission; import org.dromara.jpom.plugin.PluginFactory; import org.dromara.jpom.socket.ServiceFileTailWatcher; +import org.dromara.jpom.system.ServerConfig; import org.dromara.jpom.system.db.DataInitEvent; import org.dromara.jpom.util.CommandUtil; import org.dromara.jpom.util.SyncFinisherUtil; @@ -50,8 +55,10 @@ import org.springframework.http.MediaType; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.TimeZone; @@ -73,11 +80,14 @@ public class CacheManageController extends BaseServerController implements ICach private final JpomApplication jpomApplication; private final DataInitEvent dataInitEvent; + private final ServerConfig.ClusterConfig clusterConfig; public CacheManageController(JpomApplication jpomApplication, - DataInitEvent dataInitEvent) { + DataInitEvent dataInitEvent, + ServerConfig serverConfig) { this.jpomApplication = jpomApplication; this.dataInitEvent = dataInitEvent; + this.clusterConfig = serverConfig.getCluster(); } /** @@ -89,28 +99,31 @@ public class CacheManageController extends BaseServerController implements ICach */ @PostMapping(value = "server-cache", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> serverCache() { + public IJsonMessage> serverCache() { Map map = new HashMap<>(10); map.put("cacheFileSize", this.tempFileSize); map.put("dataSize", this.dataSize); - int size = LoginControl.LFU_CACHE.size(); map.put("oldJarsSize", this.oldJarsSize); - map.put("ipSize", size); + { + LFUCache lfuCache = LoginControl.LFU_CACHE; + List> list = CollUtil.newArrayList(lfuCache.cacheObjIterator()); + map.put("errorIp", list); + } int oneLineCount = ServiceFileTailWatcher.getOneLineCount(); map.put("readFileOnLineCount", oneLineCount); - map.put("cacheBuildFileSize", BuildUtil.buildCacheSize); - map.put("taskList", CronUtils.list()); map.put("pluginSize", PluginFactory.size()); map.put("shardingSize", BaseServerController.SHARDING_IDS.size()); - map.put("buildKeys", BuildInfoManage.buildKeys()); + map.put("buildKeys", BuildExecuteManage.buildKeys()); map.put("syncFinisKeys", SyncFinisherUtil.keys()); map.put("dateTime", DateTime.now().toString()); map.put("timeZoneId", TimeZone.getDefault().getID()); map.put("errorWorkspace", dataInitEvent.getErrorWorkspaceTable()); + map.put("clusterId", clusterConfig.getId()); + map.put("installId", JpomManifest.getInstance().getInstallId()); // - return JsonMessage.success("ok", map); + return JsonMessage.success("", map); } /** @@ -120,8 +133,8 @@ public class CacheManageController extends BaseServerController implements ICach */ @RequestMapping(value = "node_cache.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public String nodeCache() { - return NodeForward.request(getNode(), getRequest(), NodeUrl.Cache).toString(); + public String nodeCache(HttpServletRequest request) { + return NodeForward.request(getNode(), request, NodeUrl.Cache).toString(); } /** @@ -132,7 +145,7 @@ public class CacheManageController extends BaseServerController implements ICach */ @RequestMapping(value = "clearCache.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage clearCache(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "类型错误") String type) { + public IJsonMessage clearCache(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "类型错误") String type, HttpServletRequest request) { switch (type) { case "serviceCacheFileSize": { File tempPath = JpomApplication.getInstance().getTempPath(); @@ -150,7 +163,7 @@ public class CacheManageController extends BaseServerController implements ICach break; } default: - return NodeForward.request(getNode(), getRequest(), NodeUrl.ClearCache); + return NodeForward.request(getNode(), request, NodeUrl.ClearCache); } return JsonMessage.success("清空成功"); @@ -164,7 +177,7 @@ public class CacheManageController extends BaseServerController implements ICach */ @GetMapping(value = "clear-error-workspace", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage clearErrorWorkspace(@ValidatorItem String tableName) { + public IJsonMessage clearErrorWorkspace(@ValidatorItem String tableName) { dataInitEvent.clearErrorWorkspace(tableName); return JsonMessage.success("清理成功"); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/LogManageController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/LogManageController.java index ac24c31e5..fa20239f0 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/LogManageController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/LogManageController.java @@ -25,9 +25,10 @@ package org.dromara.jpom.controller.system; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -66,7 +67,7 @@ public class LogManageController extends BaseServerController { @RequestMapping(value = "log_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> logData(String nodeId) { + public IJsonMessage> logData(String nodeId) { if (StrUtil.isNotEmpty(nodeId)) { return NodeForward.request(getNode(), getRequest(), NodeUrl.SystemLog); } @@ -83,7 +84,7 @@ public class LogManageController extends BaseServerController { */ @RequestMapping(value = "log_del.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage logData(String nodeId, + public IJsonMessage logData(String nodeId, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "path错误") String path) { if (StrUtil.isNotEmpty(nodeId)) { return NodeForward.request(getNode(), getRequest(), NodeUrl.DelSystemLog); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/OauthConfigController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/OauthConfigController.java index 3df184818..9b6745871 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/OauthConfigController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/OauthConfigController.java @@ -24,7 +24,8 @@ package org.dromara.jpom.controller.system; import cn.hutool.core.lang.Tuple; import cn.hutool.extra.servlet.ServletUtil; -import org.dromara.jpom.common.JsonMessage; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.oauth2.BaseOauth2Config; import org.dromara.jpom.oauth2.Oauth2Factory; import org.dromara.jpom.permission.ClassFeature; @@ -59,7 +60,7 @@ public class OauthConfigController { @GetMapping(value = "oauth2", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage oauth2(String provide) { + public IJsonMessage oauth2(String provide) { Tuple tuple = BaseOauth2Config.getDbKey(provide); Assert.notNull(tuple, "没有对应的类型"); BaseOauth2Config configDefNewInstance = systemParametersServer.getConfigDefNewInstance(tuple.get(0), tuple.get(1)); @@ -68,7 +69,7 @@ public class OauthConfigController { @PostMapping(value = "oauth2-save", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage saveOauth2(HttpServletRequest request, String provide) { + public IJsonMessage saveOauth2(HttpServletRequest request, String provide) { Tuple tuple = BaseOauth2Config.getDbKey(provide); Assert.notNull(tuple, "没有对应的类型"); Class oauth2ConfigClass = tuple.get(1); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java index c1a656758..9389eb5fb 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemConfigController.java @@ -34,6 +34,8 @@ import cn.hutool.core.text.CharPool; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.Lombok; @@ -41,7 +43,6 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.db.DbExtConfig; import org.dromara.jpom.db.StorageServiceFactory; @@ -106,8 +107,8 @@ public class SystemConfigController extends BaseServerController { */ @RequestMapping(value = "config-data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage configData(String machineId, HttpServletRequest request) { - JsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.SystemGetConfig); + public IJsonMessage configData(String machineId, HttpServletRequest request) { + IJsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.SystemGetConfig); return Optional.ofNullable(message).orElseGet(() -> { JSONObject jsonObject = new JSONObject(); Resource resource = ExtConfigBean.getResource(); @@ -125,7 +126,7 @@ public class SystemConfigController extends BaseServerController { @PostMapping(value = "save_config.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission(superUser = true) - public JsonMessage saveConfig(String machineId, String content, String restart, HttpServletRequest request) throws SQLException, IOException { + public IJsonMessage saveConfig(String machineId, String content, String restart, HttpServletRequest request) throws SQLException, IOException { JsonMessage jsonMessage = this.tryRequestNode(machineId, request, NodeUrl.SystemSaveConfig); if (jsonMessage != null) { return jsonMessage; @@ -191,7 +192,7 @@ public class SystemConfigController extends BaseServerController { */ @RequestMapping(value = "ip-config-data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.SYSTEM_CONFIG_IP, method = MethodFeature.LIST) - public JsonMessage ipConfigData() { + public IJsonMessage ipConfigData() { SystemIpConfigModel config = systemParametersServer.getConfig(SystemIpConfigModel.ID, SystemIpConfigModel.class); JSONObject jsonObject = new JSONObject(); if (config != null) { @@ -205,7 +206,7 @@ public class SystemConfigController extends BaseServerController { @RequestMapping(value = "save_ip_config.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.SYSTEM_CONFIG_IP, method = MethodFeature.EDIT) - public JsonMessage saveIpConfig(String allowed, String prohibited) { + public IJsonMessage saveIpConfig(String allowed, String prohibited) { SystemIpConfigModel systemIpConfigModel = new SystemIpConfigModel(); String allowed1 = StrUtil.emptyToDefault(allowed, StrUtil.EMPTY); this.checkIpV4(allowed1); @@ -269,7 +270,7 @@ public class SystemConfigController extends BaseServerController { */ @GetMapping(value = "get_proxy_config", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getPoxyConfig() { + public IJsonMessage getPoxyConfig() { JSONArray array = systemParametersServer.getConfigDefNewInstance(ProxySelectorConfig.KEY, JSONArray.class); return JsonMessage.success("", array); } @@ -281,7 +282,7 @@ public class SystemConfigController extends BaseServerController { * @return json */ @PostMapping(value = "save_proxy_config", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage saveProxyConfig(@RequestBody List proxys) { + public IJsonMessage saveProxyConfig(@RequestBody List proxys) { proxys = ObjectUtil.defaultIfNull(proxys, Collections.emptyList()); for (ProxySelectorConfig.ProxyConfigItem proxy : proxys) { if (StrUtil.isNotEmpty(proxy.getProxyAddress())) { diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemExtConfigController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemExtConfigController.java index 6bf5c898d..c69b25c36 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemExtConfigController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemExtConfigController.java @@ -30,11 +30,12 @@ import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.permission.ClassFeature; import org.dromara.jpom.permission.Feature; @@ -114,7 +115,7 @@ public class SystemExtConfigController extends BaseServerController { @GetMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list() throws Exception { + public IJsonMessage> list() throws Exception { Map> parentMap = new LinkedHashMap<>(10); // root 节点 parentMap.put(StrUtil.SLASH, new TreeNode<>(StrUtil.SLASH, null, "根路径", 0)); @@ -192,7 +193,7 @@ public class SystemExtConfigController extends BaseServerController { @GetMapping(value = "get-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getItem(@ValidatorItem String name) { + public IJsonMessage getItem(@ValidatorItem String name) { InputStream resourceInputStream = ExtConfigBean.getConfigResourceInputStream(name); String s = IoUtil.readUtf8(resourceInputStream); return JsonMessage.success("", s); @@ -200,7 +201,7 @@ public class SystemExtConfigController extends BaseServerController { @PostMapping(value = "save-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage saveItem(@ValidatorItem String name, @ValidatorItem String content) { + public IJsonMessage saveItem(@ValidatorItem String name, @ValidatorItem String content) { File configResourceFile = ExtConfigBean.getConfigResourceFile(name); Assert.notNull(configResourceFile, "不能编辑对应的配置文件"); FileUtil.writeUtf8String(content, configResourceFile); @@ -209,7 +210,7 @@ public class SystemExtConfigController extends BaseServerController { @GetMapping(value = "get-default-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getDefaultItem(@ValidatorItem String name) { + public IJsonMessage getDefaultItem(@ValidatorItem String name) { InputStream resourceInputStream = ExtConfigBean.getDefaultConfigResourceInputStream(name); String s = IoUtil.readUtf8(resourceInputStream); return JsonMessage.success("", s); @@ -217,7 +218,7 @@ public class SystemExtConfigController extends BaseServerController { @GetMapping(value = "add-item", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage addItem(@ValidatorItem String name) { + public IJsonMessage addItem(@ValidatorItem String name) { boolean existConfigResource = ExtConfigBean.existConfigResource(name); Assert.state(!existConfigResource, "对应的配置文件已经存在啦"); File resourceFile = ExtConfigBean.getConfigResourceFile(name); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java index aea7531d9..56c69e3ec 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/SystemUpdateController.java @@ -29,7 +29,9 @@ import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; +import cn.keepbx.jpom.IJsonMessage; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; @@ -93,8 +95,8 @@ public class SystemUpdateController extends BaseServerController implements ILoa @PostMapping(value = "info", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage info(HttpServletRequest request, String machineId) { - JsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.Info); + public IJsonMessage info(HttpServletRequest request, String machineId) { + IJsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.Info); return Optional.ofNullable(message).orElseGet(() -> { JpomManifest instance = JpomManifest.getInstance(); cn.keepbx.jpom.RemoteVersion remoteVersion = RemoteVersion.cacheInfo(); @@ -109,7 +111,7 @@ public class SystemUpdateController extends BaseServerController implements ILoa @GetMapping(value = "change-beta-release", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage changeBetaRelease(String beta) { + public IJsonMessage changeBetaRelease(String beta) { boolean betaBool = this.changeBetaRelease2(beta); RemoteVersion.loadRemoteInfo(); return JsonMessage.success(betaBool ? "成功加入 beta 计划" : "关闭 beta 计划成功"); @@ -128,7 +130,7 @@ public class SystemUpdateController extends BaseServerController implements ILoa * @return changelog md */ @PostMapping(value = "change_log", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage changeLog(HttpServletRequest request, String machineId) { + public IJsonMessage changeLog(HttpServletRequest request, String machineId) { boolean betaRelease = RemoteVersion.betaRelease(); JsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.CHANGE_LOG, "beta", String.valueOf(betaRelease)); if (message != null) { @@ -147,7 +149,7 @@ public class SystemUpdateController extends BaseServerController implements ILoa @PostMapping(value = "upload-jar-sharding", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE, log = false) - public JsonMessage uploadJarSharding(MultipartFile file, + public IJsonMessage uploadJarSharding(MultipartFile file, String machineId, String sliceId, Integer totalSlice, @@ -171,7 +173,7 @@ public class SystemUpdateController extends BaseServerController implements ILoa @PostMapping(value = "upload-jar-sharding-merge", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EXECUTE) - public JsonMessage uploadJar(String sliceId, + public IJsonMessage uploadJar(String sliceId, Integer totalSlice, String fileSumMd5, HttpServletRequest request, @@ -212,9 +214,9 @@ public class SystemUpdateController extends BaseServerController implements ILoa * @see RemoteVersion */ @PostMapping(value = "check_version.json", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage checkVersion(HttpServletRequest request, + public IJsonMessage checkVersion(HttpServletRequest request, String machineId) { - JsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.CHECK_VERSION); + IJsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.CHECK_VERSION); return Optional.ofNullable(message).orElseGet(() -> { cn.keepbx.jpom.RemoteVersion remoteVersion = RemoteVersion.loadRemoteInfo(); return JsonMessage.success("", remoteVersion); @@ -229,10 +231,10 @@ public class SystemUpdateController extends BaseServerController implements ILoa */ @GetMapping(value = "remote_upgrade.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DOWNLOAD) - public JsonMessage upgrade(HttpServletRequest request, + public IJsonMessage upgrade(HttpServletRequest request, String machineId) throws IOException { - JsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.REMOTE_UPGRADE); + IJsonMessage message = this.tryRequestNode(machineId, request, NodeUrl.REMOTE_UPGRADE); return Optional.ofNullable(message).orElseGet(() -> { try { RemoteVersion.upgrade(JpomApplication.getInstance().getTempPath().getAbsolutePath(), objects -> backupInfoService.autoBackup()); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceController.java index 6d1f09438..5322b3357 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceController.java @@ -22,24 +22,29 @@ */ package org.dromara.jpom.controller.system; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.db.TableName; +import org.dromara.jpom.func.system.model.ClusterInfoModel; +import org.dromara.jpom.func.system.service.ClusterInfoService; import org.dromara.jpom.model.BaseWorkspaceModel; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.data.WorkspaceModel; -import org.dromara.jpom.model.log.UserOperateLogV1; import org.dromara.jpom.permission.ClassFeature; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -52,7 +57,9 @@ import org.springframework.util.Assert; import org.springframework.web.bind.annotation.*; import java.io.InputStream; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.Set; /** @@ -68,13 +75,16 @@ public class WorkspaceController extends BaseServerController { private final WorkspaceService workspaceService; private final UserBindWorkspaceService userBindWorkspaceService; private final SystemParametersServer systemParametersServer; + private final ClusterInfoService clusterInfoService; public WorkspaceController(WorkspaceService workspaceService, UserBindWorkspaceService userBindWorkspaceService, - SystemParametersServer systemParametersServer) { + SystemParametersServer systemParametersServer, + ClusterInfoService clusterInfoService) { this.workspaceService = workspaceService; this.userBindWorkspaceService = userBindWorkspaceService; this.systemParametersServer = systemParametersServer; + this.clusterInfoService = clusterInfoService; } /** @@ -86,13 +96,21 @@ public class WorkspaceController extends BaseServerController { */ @PostMapping(value = "/edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage create(String id, @ValidatorItem String name, @ValidatorItem String description, String group) { + public IJsonMessage create(String id, + @ValidatorItem String name, + @ValidatorItem String description, + String group, + @ValidatorItem(msg = "请选择集群") String clusterInfoId) { + // + ClusterInfoModel clusterInfoModel = clusterInfoService.getByKey(clusterInfoId); + Assert.notNull(clusterInfoModel, "对应的集群不存在"); this.checkInfo(id, name); // WorkspaceModel workspaceModel = new WorkspaceModel(); workspaceModel.setName(name); workspaceModel.setDescription(description); workspaceModel.setGroup(group); + workspaceModel.setClusterInfoId(clusterInfoModel.getId()); if (StrUtil.isEmpty(id)) { // 创建 workspaceService.insert(workspaceModel); @@ -120,7 +138,7 @@ public class WorkspaceController extends BaseServerController { */ @PostMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list() { + public IJsonMessage> list() { PageResultDto listPage = workspaceService.listPage(getRequest()); return JsonMessage.success("", listPage); } @@ -132,7 +150,7 @@ public class WorkspaceController extends BaseServerController { */ @GetMapping(value = "list-group-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listGroupAll() { + public IJsonMessage> listGroupAll() { List listGroup = workspaceService.listGroup(); return JsonMessage.success("", listGroup); } @@ -144,11 +162,55 @@ public class WorkspaceController extends BaseServerController { */ @GetMapping(value = "/list_all") @Feature(method = MethodFeature.LIST) - public JsonMessage> listAll() { + public IJsonMessage> listAll() { List list = workspaceService.list(); return JsonMessage.success("", list); } + /** + * 删除工作空间前检查 + * + * @param id 工作空间 ID + * @return json + */ + @GetMapping(value = "pre-check-delete", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.DEL) + @SystemPermission(superUser = true) + public IJsonMessage> preCheckDelete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { + // + Assert.state(!StrUtil.equals(id, Const.WORKSPACE_DEFAULT_ID), "不能删除默认工作空间"); + // 判断是否存在关联数据 + Set> classes = BaseWorkspaceModel.allTableClass(); + + List> nodes = new ArrayList<>(classes.size()); + for (Class aClass : classes) { + TableName tableName = aClass.getAnnotation(TableName.class); + Class parents = tableName.parents(); + // + String parent = Optional.of(parents) + .map(aClass1 -> aClass1 != Void.class ? aClass1 : null) + .map(aClass1 -> { + TableName tableName1 = aClass1.getAnnotation(TableName.class); + return tableName1.value(); + }) + .orElse(StrUtil.EMPTY); + // + String sql = "select count(1) as cnt from " + tableName.value() + " where workspaceId=?"; + Number number = workspaceService.queryNumber(sql, id); + + TreeNode treeNode = new TreeNode<>(tableName.value(), parent, tableName.name(), 0); + // + JSONObject jsonObject = new JSONObject(); + jsonObject.put("workspaceBind", tableName.workspaceBind()); + jsonObject.put("count", ObjectUtil.defaultIfNull(number, Number::intValue, 0)); + treeNode.setExtra(jsonObject); + nodes.add(treeNode); + } + Tree stringTree = TreeUtil.buildSingle(nodes, StrUtil.EMPTY); + stringTree.setName(StrUtil.EMPTY); + return new JsonMessage<>(200, "", stringTree); + } + /** * 删除工作空间 * @@ -158,38 +220,52 @@ public class WorkspaceController extends BaseServerController { @GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) @SystemPermission(superUser = true) - public JsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { + public IJsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { // Assert.state(!StrUtil.equals(id, Const.WORKSPACE_DEFAULT_ID), "不能删除默认工作空间"); // 判断是否存在关联数据 - Set> classes = BaseWorkspaceModel.allClass(); - StringBuilder autoDelete = new StringBuilder(StrUtil.EMPTY); + Set> classes = BaseWorkspaceModel.allTableClass(); + + List> autoDeleteClass = new ArrayList<>(); for (Class aClass : classes) { TableName tableName = aClass.getAnnotation(TableName.class); - if (tableName == null) { - continue; - } - if (aClass == UserOperateLogV1.class) { - // 用户操作日志 - String sql = "delete from " + tableName.value() + " where workspaceId=?"; - int execute = workspaceService.execute(sql, id); - if (execute > 0) { - autoDelete.append(StrUtil.format(" 自动删除 {} 表中数据 {} 条数据", tableName.value(), execute)); - } - continue; - } - String sql = "select count(1) as cnt from " + tableName.value() + " where workspaceId=?"; - List query = workspaceService.query(sql, id); - Entity first = CollUtil.getFirst(query); - if (first != null) { - Assert.notEmpty(first, "没有对应的信息"); - Integer cnt = first.getInt("cnt"); - Assert.state(cnt == null || cnt <= 0, "当前工作空间下还存在关联数据:" + tableName.name()); + int workspaceBind = tableName.workspaceBind(); + if (workspaceBind == 2) { + // 先忽略不执行自动删除 + autoDeleteClass.add(aClass); + } else if (workspaceBind == 3) { + // 父级不存在自动删除 + Class parents = tableName.parents(); + Assert.state(parents != Void.class, "表信息配置错误"); + TableName tableName1 = parents.getAnnotation(TableName.class); + Assert.notNull(tableName1, "父级表信息配置错误," + aClass); + // + String sql = "select count(1) as cnt from " + tableName1.value() + " where workspaceId=?"; + int cnt = ObjectUtil.defaultIfNull(workspaceService.queryNumber(sql, id), Number::intValue, 0); + Assert.state(cnt <= 0, StrUtil.format("当前工作空间下还存在关联:{} 和 {} 数据", tableName.name(), tableName1.name())); + // 等待自动删除 + autoDeleteClass.add(aClass); + } else { + // 其他严格检查的情况 + String sql = "select count(1) as cnt from " + tableName.value() + " where workspaceId=?"; + int cnt = ObjectUtil.defaultIfNull(workspaceService.queryNumber(sql, id), Number::intValue, 0); + Assert.state(cnt <= 0, "当前工作空间下还存在关联数据:" + tableName.name()); } } // 判断用户绑定关系 boolean workspace = userBindWorkspaceService.existsWorkspace(id); Assert.state(!workspace, "当前工作空间下还绑定着用户信息"); + // 最后执行自动删除 + StringBuilder autoDelete = new StringBuilder(StrUtil.EMPTY); + for (Class aClass : autoDeleteClass) { + TableName tableName = aClass.getAnnotation(TableName.class); + // 自动删除 + String sql = "delete from " + tableName.value() + " where workspaceId=?"; + int execute = workspaceService.execute(sql, id); + if (execute > 0) { + autoDelete.append(StrUtil.format(" 自动删除 {} 表中数据 {} 条数据", tableName.value(), execute)); + } + } // 删除缓存 String menusConfigKey = StrUtil.format("menus_config_{}", id); systemParametersServer.delByKey(menusConfigKey); @@ -208,7 +284,7 @@ public class WorkspaceController extends BaseServerController { */ @RequestMapping(value = "get_menus_config", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage getMenusConfig(String workspaceId) { + public IJsonMessage getMenusConfig(String workspaceId) { WorkspaceModel workspaceModel = workspaceService.getByKey(workspaceId); Assert.notNull(workspaceModel, "不存在对应的工作空间"); JSONObject config = systemParametersServer.getConfigDefNewInstance(StrUtil.format("menus_config_{}", workspaceId), JSONObject.class); @@ -221,7 +297,7 @@ public class WorkspaceController extends BaseServerController { @PostMapping(value = "save_menus_config.json", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage saveMenusConfig(String serverMenuKeys, String nodeMenuKeys, String workspaceId) { + public IJsonMessage saveMenusConfig(String serverMenuKeys, String nodeMenuKeys, String workspaceId) { WorkspaceModel workspaceModel = workspaceService.getByKey(workspaceId); Assert.notNull(workspaceModel, "不存在对应的工作空间"); // diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceEnvVarController.java b/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceEnvVarController.java index d8b120b45..530a8c94d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceEnvVarController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/system/WorkspaceEnvVarController.java @@ -27,9 +27,10 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; @@ -76,7 +77,7 @@ public class WorkspaceEnvVarController extends BaseServerController { */ @PostMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(HttpServletRequest request) { + public IJsonMessage> list(HttpServletRequest request) { PageResultDto listPage = workspaceEnvVarService.listPage(request); listPage.each(workspaceEnvVarModel -> { Integer privacy = workspaceEnvVarModel.getPrivacy(); @@ -87,6 +88,24 @@ public class WorkspaceEnvVarController extends BaseServerController { return JsonMessage.success("", listPage); } + /** + * 全部环境变量 + * + * @return json + */ + @PostMapping(value = "/all", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.LIST) + public IJsonMessage> allList(HttpServletRequest request) { + List list = workspaceEnvVarService.listByWorkspace(request); + list.forEach(workspaceEnvVarModel -> { + Integer privacy = workspaceEnvVarModel.getPrivacy(); + if (privacy != null && privacy == 1) { + workspaceEnvVarModel.setValue(StrUtil.EMPTY); + } + }); + return JsonMessage.success("", list); + } + /** * 编辑变量 * @@ -98,7 +117,7 @@ public class WorkspaceEnvVarController extends BaseServerController { */ @PostMapping(value = "/edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(String id, + public IJsonMessage edit(String id, @ValidatorItem String workspaceId, @ValidatorItem String name, String value, @@ -213,7 +232,7 @@ public class WorkspaceEnvVarController extends BaseServerController { */ @GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id, + public IJsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id, @ValidatorItem String workspaceId) { if (!getUser().isSystemUser()) { Assert.state(!StrUtil.equals(workspaceId, ServerConst.WORKSPACE_GLOBAL), "全局工作空间变量请到系统管理修改"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserBasicInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserBasicInfoController.java index c4acb9277..43fbb1eb5 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserBasicInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserBasicInfoController.java @@ -30,13 +30,17 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; +import org.dromara.jpom.common.JpomManifest; import org.dromara.jpom.common.interceptor.PermissionInterceptor; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; +import org.dromara.jpom.func.system.model.ClusterInfoModel; +import org.dromara.jpom.func.system.service.ClusterInfoService; import org.dromara.jpom.func.user.model.UserLoginLogModel; import org.dromara.jpom.func.user.server.UserLoginLogServer; import org.dromara.jpom.model.PageResultDto; @@ -82,19 +86,22 @@ public class UserBasicInfoController extends BaseServerController { private final ServerConfig.UserConfig userConfig; private final UserLoginLogServer userLoginLogServer; private final DbUserOperateLogService dbUserOperateLogService; + private final ClusterInfoService clusterInfoService; public UserBasicInfoController(SystemParametersServer systemParametersServer, UserBindWorkspaceService userBindWorkspaceService, UserService userService, ServerConfig serverConfig, UserLoginLogServer userLoginLogServer, - DbUserOperateLogService dbUserOperateLogService) { + DbUserOperateLogService dbUserOperateLogService, + ClusterInfoService clusterInfoService) { this.systemParametersServer = systemParametersServer; this.userBindWorkspaceService = userBindWorkspaceService; this.userService = userService; this.userConfig = serverConfig.getUser(); this.userLoginLogServer = userLoginLogServer; this.dbUserOperateLogService = dbUserOperateLogService; + this.clusterInfoService = clusterInfoService; } @@ -106,7 +113,7 @@ public class UserBasicInfoController extends BaseServerController { * @author Hotstrip */ @RequestMapping(value = "user-basic-info", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> getUserBasicInfo() { + public IJsonMessage> getUserBasicInfo() { UserModel userModel = getUser(); userModel = userService.getByKey(userModel.getId(), false); // return basic info @@ -125,9 +132,9 @@ public class UserBasicInfoController extends BaseServerController { } @RequestMapping(value = "save_basicInfo.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage saveBasicInfo(String email, - String dingDing, String workWx, String code, - @ValidatorItem(value = ValidatorRule.NOT_BLANK, range = "2:10", msg = "昵称长度只能是2-10") String name) { + public IJsonMessage saveBasicInfo(String email, + String dingDing, String workWx, String code, + @ValidatorItem(value = ValidatorRule.NOT_BLANK, range = "2:10", msg = "昵称长度只能是2-10") String name) { UserModel user = getUser(); UserModel userModel = userService.getByKey(user.getId()); UserModel updateModel = new UserModel(user.getId()); @@ -162,7 +169,7 @@ public class UserBasicInfoController extends BaseServerController { * @return msg */ @RequestMapping(value = "sendCode.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage sendCode(@ValidatorItem(value = ValidatorRule.EMAIL, msg = "邮箱格式不正确") String email) { + public IJsonMessage sendCode(@ValidatorItem(value = ValidatorRule.EMAIL, msg = "邮箱格式不正确") String email) { MailAccountModel config = systemParametersServer.getConfig(MailAccountModel.ID, MailAccountModel.class); Assert.notNull(config, "管理员还没有配置系统邮箱,请联系管理配置发件信息"); int randomInt = RandomUtil.randomInt(1000, 9999); @@ -182,7 +189,7 @@ public class UserBasicInfoController extends BaseServerController { * @return msg */ @GetMapping(value = "my-workspace", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> myWorkspace() { + public IJsonMessage> myWorkspace() { UserModel user = getUser(); List models = userBindWorkspaceService.listUserWorkspaceInfo(user); Assert.notEmpty(models, "当前账号没有绑定任何工作空间,请联系管理员处理"); @@ -194,6 +201,7 @@ public class UserBasicInfoController extends BaseServerController { userWorkspaceModel.setName(workspaceModel.getName()); userWorkspaceModel.setGroup(workspaceModel.getGroup()); userWorkspaceModel.setOriginalName(workspaceModel.getName()); + userWorkspaceModel.setClusterInfoId(workspaceModel.getClusterInfoId()); Long createTimeMillis = workspaceModel.getCreateTimeMillis(); userWorkspaceModel.setSort((int) (ObjectUtil.defaultIfNull(createTimeMillis, 0L) / 1000L)); return userWorkspaceModel; @@ -220,7 +228,7 @@ public class UserBasicInfoController extends BaseServerController { * @return msg */ @PostMapping(value = "save-workspace", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage saveWorkspace(@RequestBody List workspaceModels) { + public IJsonMessage saveWorkspace(@RequestBody List workspaceModels) { Assert.notEmpty(workspaceModels, "没有选择任何工作空间"); List collect = workspaceModels.stream() .filter(workspaceModel -> StrUtil.isNotEmpty(workspaceModel.getId())) @@ -238,7 +246,7 @@ public class UserBasicInfoController extends BaseServerController { * @return json */ @GetMapping(value = "close_mfa", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage closeMfa(@ValidatorItem String code) { + public IJsonMessage closeMfa(@ValidatorItem String code) { UserModel user = getUser(); boolean mfaCode = userService.verifyMfaCode(user.getId(), code); Assert.state(mfaCode, "验证码不正确"); @@ -249,7 +257,7 @@ public class UserBasicInfoController extends BaseServerController { } @GetMapping(value = "generate_mfa", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage generateMfa() { + public IJsonMessage generateMfa() { UserModel user = getUser(); JSONObject jsonObject = new JSONObject(); String tfaKey = TwoFactorAuthUtils.generateTFAKey(); @@ -266,7 +274,7 @@ public class UserBasicInfoController extends BaseServerController { * @return json */ @GetMapping(value = "bind_mfa", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage bindMfa(String mfa, String twoCode) { + public IJsonMessage bindMfa(String mfa, String twoCode) { // UserModel user = getUser(); boolean bindMfa = userService.hasBindMfa(user.getId()); @@ -287,7 +295,7 @@ public class UserBasicInfoController extends BaseServerController { */ @RequestMapping(value = "list-login-log-data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listLoginLogData(HttpServletRequest request) { + public IJsonMessage> listLoginLogData(HttpServletRequest request) { UserModel user = getUser(); PageResultDto pageResult = userLoginLogServer.listPageByUserId(request, user.getId()); return JsonMessage.success("", pageResult); @@ -300,9 +308,23 @@ public class UserBasicInfoController extends BaseServerController { */ @RequestMapping(value = "list-operate-log-data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listOperateLogData(HttpServletRequest request) { + public IJsonMessage> listOperateLogData(HttpServletRequest request) { UserModel user = getUser(); PageResultDto pageResult = dbUserOperateLogService.listPageByUserId(request, user.getId()); return JsonMessage.success("", pageResult); } + + /** + * 查询集群列表 + * + * @return json + */ + @GetMapping(value = "cluster-list") + public IJsonMessage clusterList() { + List list = clusterInfoService.list(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("list", list); + jsonObject.put("currentId", JpomManifest.getInstance().getInstallId()); + return JsonMessage.success("", jsonObject); + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserInfoController.java b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserInfoController.java index 201994dc2..18afc8a9a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserInfoController.java @@ -24,9 +24,10 @@ package org.dromara.jpom.controller.user; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.model.user.UserBindWorkspaceModel; @@ -71,9 +72,9 @@ public class UserInfoController extends BaseServerController { * @return json */ @RequestMapping(value = "updatePwd", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage updatePwd(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "密码不能为空") String oldPwd, - @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "密码不能为空") String newPwd, - HttpSession session) { + public IJsonMessage updatePwd(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "密码不能为空") String oldPwd, + @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "密码不能为空") String newPwd, + HttpSession session) { Assert.state(!StrUtil.equals(oldPwd, newPwd), "新旧密码一致"); UserModel userName = getUser(); Assert.state(!userName.isDemoUser(), "当前账户为演示账号,不支持修改密码"); @@ -98,7 +99,7 @@ public class UserInfoController extends BaseServerController { * @return json */ @GetMapping(value = "workspace_list", produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> workspaceList(@ValidatorItem String userId) { + public IJsonMessage> workspaceList(@ValidatorItem String userId) { List workspaceModels = userBindWorkspaceService.listUserWorkspace(userId); return JsonMessage.success("", workspaceModels); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserListController.java b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserListController.java index d79e847b0..8996d4b87 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserListController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserListController.java @@ -27,10 +27,11 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.user.UserModel; @@ -73,7 +74,7 @@ public class UserListController extends BaseServerController { */ @RequestMapping(value = "get_user_list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getUserList() { + public IJsonMessage> getUserList() { PageResultDto userModelPageResultDto = userService.listPage(getRequest()); userModelPageResultDto.each(userModel -> { boolean bindMfa = userService.hasBindMfa(userModel.getId()); @@ -93,7 +94,7 @@ public class UserListController extends BaseServerController { */ @RequestMapping(value = "get_user_list_all", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getUserListAll() { + public IJsonMessage> getUserListAll() { List list = userService.list(); return JsonMessage.success("success", list); } @@ -106,7 +107,7 @@ public class UserListController extends BaseServerController { */ @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage addUser(String type) { + public IJsonMessage addUser(String type) { // boolean create = StrUtil.equals(type, "add"); UserModel userModel = this.parseUser(create); @@ -200,7 +201,7 @@ public class UserListController extends BaseServerController { */ @RequestMapping(value = "deleteUser", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage deleteUser(String id) { + public IJsonMessage deleteUser(String id) { UserModel userName = getUser(); Assert.state(!StrUtil.equals(userName.getId(), id), "不能删除自己"); @@ -226,7 +227,7 @@ public class UserListController extends BaseServerController { */ @GetMapping(value = "unlock", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage unlock(@ValidatorItem String id) { + public IJsonMessage unlock(@ValidatorItem String id) { UserModel update = UserModel.unLock(id); userService.updateById(update); return JsonMessage.success("解锁成功"); @@ -241,7 +242,7 @@ public class UserListController extends BaseServerController { @GetMapping(value = "close_user_mfa", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) @SystemPermission(superUser = true) - public JsonMessage closeMfa(@ValidatorItem String id) { + public IJsonMessage closeMfa(@ValidatorItem String id) { UserModel update = new UserModel(id); update.setTwoFactorAuthKey(StrUtil.EMPTY); userService.updateById(update); @@ -256,7 +257,7 @@ public class UserListController extends BaseServerController { */ @GetMapping(value = "rest-user-pwd", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage restUserPwd(@ValidatorItem String id) { + public IJsonMessage restUserPwd(@ValidatorItem String id) { UserModel userModel = userService.getByKey(id); Assert.notNull(userModel, "账号不存在"); Assert.state(!userModel.isSuperSystemUser(), "超级管理员不能通过此方式重置密码"); diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserOptLogController.java b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserOptLogController.java index d22abcca3..a9a8a0aa2 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserOptLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserOptLogController.java @@ -22,8 +22,9 @@ */ package org.dromara.jpom.controller.user; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.log.UserOperateLogV1; import org.dromara.jpom.permission.ClassFeature; @@ -63,7 +64,7 @@ public class UserOptLogController extends BaseServerController { */ @RequestMapping(value = "list_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listData(HttpServletRequest request) { + public IJsonMessage> listData(HttpServletRequest request) { PageResultDto pageResult = dbUserOperateLogService.listPage(request); return JsonMessage.success("", pageResult); } diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserPermissionGroupController.java b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserPermissionGroupController.java index 6c3750f39..0e9ef0e5a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserPermissionGroupController.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserPermissionGroupController.java @@ -28,11 +28,12 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.user.UserPermissionGroupBean; @@ -80,7 +81,7 @@ public class UserPermissionGroupController extends BaseServerController { */ @RequestMapping(value = "get-list", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getUserList() { + public IJsonMessage> getUserList() { PageResultDto userModelPageResultDto = userPermissionGroupServer.listPage(getRequest()); return new JsonMessage<>(200, "", userModelPageResultDto); } @@ -92,7 +93,7 @@ public class UserPermissionGroupController extends BaseServerController { */ @GetMapping(value = "get-list-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> getListAll() { + public IJsonMessage> getListAll() { List list = userPermissionGroupServer.list(); return new JsonMessage<>(200, "", list); } @@ -104,7 +105,7 @@ public class UserPermissionGroupController extends BaseServerController { */ @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(String id, + public IJsonMessage edit(String id, @ValidatorItem String name, String description, String prohibitExecute, @@ -189,7 +190,7 @@ public class UserPermissionGroupController extends BaseServerController { */ @GetMapping(value = "delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(String id) { + public IJsonMessage delete(String id) { UserPermissionGroupBean groupBean = userPermissionGroupServer.getByKey(id); Assert.notNull(groupBean, "数据不存在"); // 判断是否绑定用户 diff --git a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserWorkspaceModel.java b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserWorkspaceModel.java index fdf37f616..22c3bb607 100644 --- a/modules/server/src/main/java/org/dromara/jpom/controller/user/UserWorkspaceModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/controller/user/UserWorkspaceModel.java @@ -23,6 +23,7 @@ package org.dromara.jpom.controller.user; import lombok.Data; +import org.dromara.jpom.func.system.model.ClusterInfoModel; /** * 用户工作空间配置 @@ -48,4 +49,10 @@ public class UserWorkspaceModel { * 自定义排序规则 */ private Integer sort; + /** + * 集群Id + * + * @see ClusterInfoModel#getId() + */ + private String clusterInfoId; } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/BaseGroupNameController.java b/modules/server/src/main/java/org/dromara/jpom/func/BaseGroupNameController.java index 4a38608c1..836e88343 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/BaseGroupNameController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/BaseGroupNameController.java @@ -22,10 +22,9 @@ */ package org.dromara.jpom.func; -import cn.hutool.core.util.StrUtil; -import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.BaseGroupNameModel; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -34,8 +33,6 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; /** * @author bwcx_jzy @@ -49,20 +46,11 @@ public abstract class BaseGroupNameController extends BaseServerController { this.dbService = dbService; } + @GetMapping(value = "list-group", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listGroup() { - String sql = "select `groupName` from " + dbService.getTableName() + " group by `groupName`"; - List list = dbService.query(sql); - // 筛选字段 - List collect = list.stream() - .map(entity -> { - Object obj = entity.get("groupName"); - return StrUtil.toStringOrNull(obj); - }) - .filter(Objects::nonNull) - .distinct() - .collect(Collectors.toList()); - return JsonMessage.success("", collect); + public IJsonMessage> listGroup() { + List list = dbService.listGroupName(); + return JsonMessage.success("", list); } } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/BaseSshFileController.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/BaseSshFileController.java index 6bce3c650..09c394f40 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/BaseSshFileController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/BaseSshFileController.java @@ -24,8 +24,6 @@ package org.dromara.jpom.func.assets.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -35,6 +33,8 @@ import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.ssh.ChannelType; import cn.hutool.extra.ssh.JschUtil; import cn.hutool.extra.ssh.Sftp; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.jcraft.jsch.ChannelSftp; @@ -44,18 +44,17 @@ import com.jcraft.jsch.SftpException; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.func.assets.model.MachineSshModel; import org.dromara.jpom.func.assets.server.MachineSshServer; import org.dromara.jpom.model.data.AgentWhitelist; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; +import org.dromara.jpom.plugins.JschUtils; import org.dromara.jpom.service.node.ssh.SshService; import org.dromara.jpom.system.ServerConfig; import org.dromara.jpom.util.CommandUtil; import org.dromara.jpom.util.CompressionFileUtil; -import org.dromara.jpom.plugins.JschUtils; import org.dromara.jpom.util.StringUtil; import org.springframework.http.MediaType; import org.springframework.util.Assert; @@ -157,7 +156,7 @@ public abstract class BaseSshFileController extends BaseServerController { */ @RequestMapping(value = "root_file_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage rootFileList(@ValidatorItem String id) { + public IJsonMessage rootFileList(@ValidatorItem String id) { // return this.checkConfigPath(id, (machineSshModel, itemConfig) -> { JSONArray listDir = listRootDir(machineSshModel, itemConfig.fileDirs()); @@ -168,9 +167,9 @@ public abstract class BaseSshFileController extends BaseServerController { @RequestMapping(value = "list_file_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage listData(@ValidatorItem String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath) { + public IJsonMessage listData(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath) { return this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel, itemConfig) -> { try { JSONArray listDir = listDir(machineSshModel, allowPathParent, nextPath, itemConfig); @@ -183,10 +182,10 @@ public abstract class BaseSshFileController extends BaseServerController { @RequestMapping(value = "read_file_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage readFileData(@ValidatorItem String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath, - @ValidatorItem String name) { + public IJsonMessage readFileData(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + @ValidatorItem String name) { return this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel, itemConfig) -> { // // @@ -200,11 +199,11 @@ public abstract class BaseSshFileController extends BaseServerController { @RequestMapping(value = "update_file_data.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage updateFileData(@ValidatorItem String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath, - @ValidatorItem String name, - @ValidatorItem String content) { + public IJsonMessage updateFileData(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + @ValidatorItem String name, + @ValidatorItem String content) { return this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel, itemConfig) -> { // List allowEditSuffix = itemConfig.allowEditSuffix(); @@ -344,8 +343,8 @@ public abstract class BaseSshFileController extends BaseServerController { jsonObject.put("id", SecureUtil.sha1(allPath + StrUtil.SLASH + filename)); SftpATTRS attrs = lsEntry.getAttrs(); int mTime = attrs.getMTime(); - String format = DateUtil.format(DateUtil.date(mTime * 1000L), DatePattern.NORM_DATETIME_MINUTE_PATTERN); - jsonObject.put("modifyTime", format); + //String format = DateUtil.format(DateUtil.date(mTime * 1000L), DatePattern.NORM_DATETIME_MINUTE_PATTERN); + jsonObject.put("modifyTime", mTime * 1000L); if (attrs.isDir()) { jsonObject.put("dir", true); } else { @@ -408,10 +407,10 @@ public abstract class BaseSshFileController extends BaseServerController { @RequestMapping(value = "delete.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(@ValidatorItem String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath, - String name) { + public IJsonMessage delete(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + String name) { // name 可能为空,为空情况是删除目录 String name2 = StrUtil.emptyToDefault(name, StrUtil.EMPTY); Assert.state(!StrUtil.equals(name2, StrUtil.SLASH), "不能删除根目录"); @@ -444,11 +443,11 @@ public abstract class BaseSshFileController extends BaseServerController { @RequestMapping(value = "rename.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage rename(@ValidatorItem String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath, - @ValidatorItem String name, - @ValidatorItem String newname) { + public IJsonMessage rename(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + @ValidatorItem String name, + @ValidatorItem String newname) { return this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel, itemConfig) -> { // @@ -494,11 +493,11 @@ public abstract class BaseSshFileController extends BaseServerController { @RequestMapping(value = "upload", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage upload(@ValidatorItem String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath, - String unzip, - MultipartFile file) { + public IJsonMessage upload(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + String unzip, + MultipartFile file) { return this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel, itemConfig) -> { // String remotePath = FileUtil.normalize(allowPathParent + StrUtil.SLASH + nextPath); @@ -563,10 +562,10 @@ public abstract class BaseSshFileController extends BaseServerController { */ @RequestMapping(value = "new_file_folder.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage newFileFolder(String id, - @ValidatorItem String allowPathParent, - @ValidatorItem String nextPath, - @ValidatorItem String name, String unFolder) { + public IJsonMessage newFileFolder(String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + @ValidatorItem String name, String unFolder) { Assert.state(!StrUtil.contains(name, StrUtil.SLASH), "文件名不能包含/"); return this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel, itemConfig) -> { // @@ -609,4 +608,41 @@ public abstract class BaseSshFileController extends BaseServerController { } }); } + + /** + * 修改文件权限 + * + * @param id + * @param allowPathParent + * @param nextPath + * @param fileName + * @param permissionValue + * @return + */ + @RequestMapping(value = "change_file_permission.json", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.EDIT) + public IJsonMessage changeFilePermissions(@ValidatorItem String id, + @ValidatorItem String allowPathParent, + @ValidatorItem String nextPath, + @ValidatorItem String fileName, + @ValidatorItem String permissionValue) { + MachineSshModel machineSshModel = this.checkConfigPathChildren(id, allowPathParent, nextPath, (machineSshModel1, itemConfig) -> machineSshModel1); + if (machineSshModel == null) { + return new JsonMessage<>(400, "ssh error 或者 没有配置此文件夹"); + } + Session session = sshService.getSessionByModel(machineSshModel); + Charset charset = machineSshModel.charset(); + int timeout = machineSshModel.timeout(); + String remotePath = FileUtil.normalize(allowPathParent + StrUtil.SLASH + nextPath + StrUtil.SLASH + fileName); + try (Sftp sftp = new Sftp(session, charset, timeout)) { + ChannelSftp client = sftp.getClient(); + // + int permissions = Integer.parseInt(permissionValue, 8); + client.chmod(permissions, remotePath); + } catch (SftpException e) { + log.error("ssh修改文件权限异常...: {} {}", remotePath, permissionValue, e); + return new JsonMessage<>(400, "操作失败 " + e.getMessage()); + } + return JsonMessage.success("操作成功 "); + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerController.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerController.java index 860a58267..1f5baae77 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerController.java @@ -28,15 +28,18 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.db.Entity; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.func.BaseGroupNameController; import org.dromara.jpom.func.assets.model.MachineDockerModel; +import org.dromara.jpom.func.assets.model.MachineSshModel; import org.dromara.jpom.func.assets.server.MachineDockerServer; +import org.dromara.jpom.func.assets.server.MachineSshServer; import org.dromara.jpom.func.cert.model.CertificateInfoModel; import org.dromara.jpom.func.cert.service.CertificateInfoService; import org.dromara.jpom.model.PageResultDto; @@ -76,18 +79,21 @@ import java.util.*; public class MachineDockerController extends BaseGroupNameController { private final MachineDockerServer machineDockerServer; private final ServerConfig serverConfig; + private final MachineSshServer machineSshServer; private final DockerInfoService dockerInfoService; private final DockerSwarmInfoService dockerSwarmInfoService; private final WorkspaceService workspaceService; private final CertificateInfoService certificateInfoService; - public MachineDockerController(MachineDockerServer machineDockerServer, + public MachineDockerController(MachineSshServer machineSshServer, + MachineDockerServer machineDockerServer, DockerInfoService dockerInfoService, DockerSwarmInfoService dockerSwarmInfoService, WorkspaceService workspaceService, CertificateInfoService certificateInfoService, ServerConfig serverConfig) { super(machineDockerServer); + this.machineSshServer = machineSshServer; this.machineDockerServer = machineDockerServer; this.dockerInfoService = dockerInfoService; this.dockerSwarmInfoService = dockerSwarmInfoService; @@ -98,14 +104,14 @@ public class MachineDockerController extends BaseGroupNameController { @PostMapping(value = "list-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listJson(HttpServletRequest request) { + public IJsonMessage> listJson(HttpServletRequest request) { PageResultDto pageResultDto = machineDockerServer.listPage(request); return JsonMessage.success("", pageResultDto); } @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(String id) throws Exception { + public IJsonMessage edit(String id) throws Exception { MachineDockerModel dockerInfoModel = this.takeOverModel(); if (StrUtil.isEmpty(id)) { // 创建 @@ -142,6 +148,13 @@ public class MachineDockerController extends BaseGroupNameController { int heartbeatTimeout = getParameterInt("heartbeatTimeout", -1); String groupName = getParameter("groupName"); String certInfo = getParameter("certInfo"); + String enableSshStr = getParameter("enableSsh"); + boolean enableSsh = Convert.toBool(enableSshStr, false); + String machineSshId = getParameter("machineSshId"); + if (enableSsh) { + MachineSshModel model = machineSshServer.getByKey(machineSshId); + host = "ssh://" + model.getHost() + ":" + (model.getPort() == null ? 22 : model.getPort()); + } boolean tlsVerify = Convert.toBool(tlsVerifyStr, false); // if (tlsVerify) { @@ -167,6 +180,8 @@ public class MachineDockerController extends BaseGroupNameController { MachineDockerModel machineDockerModel = new MachineDockerModel(); machineDockerModel.setHeartbeatTimeout(heartbeatTimeout); machineDockerModel.setHost(host); + machineDockerModel.setEnableSsh(enableSsh); + machineDockerModel.setMachineSshId(machineSshId); // 保存是会验证证书一定存在 machineDockerModel.setCertExist(tlsVerify); machineDockerModel.setName(name); @@ -209,7 +224,7 @@ public class MachineDockerController extends BaseGroupNameController { @GetMapping(value = "try-local-docker", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage tryLocalDocker(HttpServletRequest request) { + public IJsonMessage tryLocalDocker(HttpServletRequest request) { try { IPlugin plugin = PluginFactory.getPlugin(DockerInfoService.DOCKER_CHECK_PLUGIN_NAME); String dockerHost = (String) plugin.execute("testLocal", new HashMap<>(1)); @@ -233,7 +248,7 @@ public class MachineDockerController extends BaseGroupNameController { @GetMapping(value = "del", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id) throws Exception { + public IJsonMessage del(@ValidatorItem String id) throws Exception { // { DockerInfoModel dockerInfoModel = new DockerInfoModel(); @@ -265,7 +280,7 @@ public class MachineDockerController extends BaseGroupNameController { */ @PostMapping(value = "distribute", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage distribute(@ValidatorItem String ids, @ValidatorItem String workspaceId, String type) { + public IJsonMessage distribute(@ValidatorItem String ids, @ValidatorItem String workspaceId, String type) { List list = StrUtil.splitTrim(ids, StrUtil.COMMA); for (String id : list) { MachineDockerModel machineDockerModel = machineDockerServer.getByKey(id); @@ -304,7 +319,7 @@ public class MachineDockerController extends BaseGroupNameController { @GetMapping(value = "list-workspace-docker", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage listWorkspaceSsh(@ValidatorItem String id) { + public IJsonMessage listWorkspaceSsh(@ValidatorItem String id) { MachineDockerModel machineDockerModel = machineDockerServer.getByKey(id); Assert.notNull(machineDockerModel, "没有对应的 docker"); JSONObject jsonObject = new JSONObject(); @@ -344,7 +359,7 @@ public class MachineDockerController extends BaseGroupNameController { */ @PostMapping(value = "import-tls", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage importTls(MultipartFile file) throws Exception { + public IJsonMessage importTls(MultipartFile file) throws Exception { Assert.notNull(file, "没有上传文件"); // 保存路径 File tempPath = FileUtil.file(serverConfig.getUserTempPath(), "docker", IdUtil.fastSimpleUUID()); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerSwarmController.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerSwarmController.java index 65ca3309e..ea78499ae 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerSwarmController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineDockerSwarmController.java @@ -25,12 +25,13 @@ package org.dromara.jpom.func.assets.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.func.assets.model.MachineDockerModel; import org.dromara.jpom.func.assets.server.MachineDockerServer; @@ -75,7 +76,7 @@ public class MachineDockerSwarmController extends BaseServerController { @PostMapping(value = "init", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage init(@ValidatorItem String id) throws Exception { + public IJsonMessage init(@ValidatorItem String id) throws Exception { MachineDockerModel dockerInfoModel1 = machineDockerServer.getByKey(id, false); Assert.notNull(dockerInfoModel1, "对应的 docker 不存在"); IPlugin plugin = PluginFactory.getPlugin(DockerSwarmInfoService.DOCKER_PLUGIN_NAME); @@ -102,7 +103,7 @@ public class MachineDockerSwarmController extends BaseServerController { */ @PostMapping(value = "join", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage join(@ValidatorItem String managerId, + public IJsonMessage join(@ValidatorItem String managerId, @ValidatorItem String id, @ValidatorItem String remoteAddr, @ValidatorItem String role) throws Exception { @@ -163,7 +164,7 @@ public class MachineDockerSwarmController extends BaseServerController { */ @GetMapping(value = "leave-force", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage leaveForce(@ValidatorItem String id) throws Exception { + public IJsonMessage leaveForce(@ValidatorItem String id) throws Exception { // MachineDockerModel dockerInfoModel = machineDockerServer.getByKey(id, false); Assert.notNull(dockerInfoModel, "不存在对应的 docker"); @@ -206,7 +207,7 @@ public class MachineDockerSwarmController extends BaseServerController { */ @GetMapping(value = "leave-node", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage leave(@ValidatorItem String id, @ValidatorItem String nodeId) throws Exception { + public IJsonMessage leave(@ValidatorItem String id, @ValidatorItem String nodeId) throws Exception { MachineDockerModel dockerModel = machineDockerServer.getByKey(id, false); Assert.notNull(dockerModel, "没有对应的 docker"); // 找到对应 docker 集群 node id 关联的数据 diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineNodeController.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineNodeController.java index 6c67f3101..ef7f41a11 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineNodeController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineNodeController.java @@ -23,8 +23,9 @@ package org.dromara.jpom.func.assets.controller; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.common.validator.ValidatorItem; @@ -70,21 +71,21 @@ public class MachineNodeController extends BaseGroupNameController { @PostMapping(value = "list-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listJson(HttpServletRequest request) { + public IJsonMessage> listJson(HttpServletRequest request) { PageResultDto pageResultDto = machineNodeServer.listPage(request); return JsonMessage.success("", pageResultDto); } @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(HttpServletRequest request) { + public IJsonMessage save(HttpServletRequest request) { machineNodeServer.update(request); return JsonMessage.success("操作成功"); } @PostMapping(value = "delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(@ValidatorItem String id) { + public IJsonMessage delete(@ValidatorItem String id) { long count = nodeService.countByMachine(id); Assert.state(count <= 0, "当前机器还关联" + count + "个节点不能删除"); machineNodeServer.delByKey(id); @@ -100,7 +101,7 @@ public class MachineNodeController extends BaseGroupNameController { */ @PostMapping(value = "distribute", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage distribute(@ValidatorItem String ids, @ValidatorItem String workspaceId) { + public IJsonMessage distribute(@ValidatorItem String ids, @ValidatorItem String workspaceId) { List list = StrUtil.splitTrim(ids, StrUtil.COMMA); for (String id : list) { MachineNodeModel machineNodeModel = machineNodeServer.getByKey(id); @@ -120,7 +121,7 @@ public class MachineNodeController extends BaseGroupNameController { @GetMapping(value = "list-node", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listData(@ValidatorItem String id) { + public IJsonMessage> listData(@ValidatorItem String id) { MachineNodeModel machineNodeModel = machineNodeServer.getByKey(id); Assert.notNull(machineNodeModel, "没有对应的机器"); NodeModel nodeModel = new NodeModel(); @@ -140,7 +141,7 @@ public class MachineNodeController extends BaseGroupNameController { */ @GetMapping(value = "list-template-node", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listTemplate() { + public IJsonMessage> listTemplate() { MachineNodeModel machineNodeModel = new MachineNodeModel(); machineNodeModel.setTemplateNode(true); List modelList = machineNodeServer.listByBean(machineNodeModel); @@ -155,7 +156,7 @@ public class MachineNodeController extends BaseGroupNameController { */ @RequestMapping(value = "save-whitelist", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.SYSTEM_NODE_WHITELIST, method = MethodFeature.EDIT) - public JsonMessage saveWhitelist(@ValidatorItem(msg = "请选择分发的机器") String ids, + public IJsonMessage saveWhitelist(@ValidatorItem(msg = "请选择分发的机器") String ids, HttpServletRequest request) { // List idList = StrUtil.splitTrim(ids, StrUtil.COMMA); @@ -172,7 +173,7 @@ public class MachineNodeController extends BaseGroupNameController { @PostMapping(value = "save-node-config", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.SYSTEM_CONFIG, method = MethodFeature.EDIT) @SystemPermission(superUser = true) - public JsonMessage saveNodeConfig(@ValidatorItem(msg = "请选择分发的机器") String ids, + public IJsonMessage saveNodeConfig(@ValidatorItem(msg = "请选择分发的机器") String ids, String content, String restart) { List idList = StrUtil.splitTrim(ids, StrUtil.COMMA); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineSshController.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineSshController.java index 8432b90f1..c99f15ad6 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineSshController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/MachineSshController.java @@ -40,9 +40,10 @@ import cn.hutool.core.util.URLUtil; import cn.hutool.db.Entity; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.ssh.JschUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.interceptor.PermissionInterceptor; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; @@ -109,7 +110,7 @@ public class MachineSshController extends BaseGroupNameController { @PostMapping(value = "list-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listJson(HttpServletRequest request) { + public IJsonMessage> listJson(HttpServletRequest request) { PageResultDto pageResultDto = machineSshServer.listPage(request); return JsonMessage.success("", pageResultDto); } @@ -131,7 +132,7 @@ public class MachineSshController extends BaseGroupNameController { */ @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage save(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "ssh名称不能为空") String name, + public IJsonMessage save(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "ssh名称不能为空") String name, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "host不能为空") String host, @ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "user不能为空") String user, String password, @@ -160,9 +161,7 @@ public class MachineSshController extends BaseGroupNameController { sshModel.setGroupName(groupName); sshModel.setHost(host); // 如果密码传递不为空就设置值 因为上面已经判断了只有修改的情况下 password 才可能为空 - if (StrUtil.isNotEmpty(password)) { - sshModel.setPassword(password); - } + Opt.ofBlankAble(password).ifPresent(sshModel::setPassword); if (StrUtil.startWith(privateKey, URLUtil.FILE_URL_PREFIX)) { String rsaPath = StrUtil.removePrefix(privateKey, URLUtil.FILE_URL_PREFIX); Assert.state(FileUtil.isFile(rsaPath), "配置的私钥文件不存在"); @@ -181,7 +180,7 @@ public class MachineSshController extends BaseGroupNameController { Charset.forName(charset); sshModel.setCharset(charset); } catch (Exception e) { - return new JsonMessage<>(405, "请填写正确的编码格式"); + return new JsonMessage<>(405, "请填写正确的编码格式," + e.getMessage()); } // 判断重复 Entity entity = Entity.create(); @@ -189,30 +188,26 @@ public class MachineSshController extends BaseGroupNameController { entity.set("port", sshModel.getPort()); entity.set("`user`", sshModel.getUser()); entity.set("connectType", sshModel.getConnectType()); - if (StrUtil.isNotEmpty(id)) { - entity.set("id", StrUtil.format(" <> {}", id)); - } + Opt.ofBlankAble(id).ifPresent(s -> entity.set("id", StrUtil.format(" <> {}", s))); boolean exists = machineSshServer.exists(entity); Assert.state(!exists, "对应的SSH已经存在啦"); try { + + String workspaceId = getWorkspaceId(); Session session = machineSshServer.getSessionByModel(sshModel); JschUtil.close(session); } catch (Exception e) { log.warn("ssh连接失败", e); return new JsonMessage<>(505, "ssh连接失败:" + e.getMessage()); } - if (add) { - machineSshServer.insert(sshModel); - } else { - machineSshServer.updateById(sshModel); - } + int i = add ? machineSshServer.insert(sshModel) : machineSshServer.updateById(sshModel); return JsonMessage.success("操作成功"); } @PostMapping(value = "delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage delete(@ValidatorItem String id) { + public IJsonMessage delete(@ValidatorItem String id) { long count = sshService.countByMachine(id); Assert.state(count <= 0, "当前机器SSH还关联" + count + "个ssh不能删除"); machineSshServer.delByKey(id); @@ -226,7 +221,7 @@ public class MachineSshController extends BaseGroupNameController { */ @PostMapping(value = "log-list-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(cls = ClassFeature.SSH_TERMINAL_LOG, method = MethodFeature.LIST) - public JsonMessage> logListData(HttpServletRequest request) { + public IJsonMessage> logListData(HttpServletRequest request) { Map paramMap = ServletUtil.getParamMap(request); PageResultDto pageResult = sshTerminalExecuteLogService.listPage(paramMap); return JsonMessage.success("获取成功", pageResult); @@ -234,7 +229,7 @@ public class MachineSshController extends BaseGroupNameController { @GetMapping(value = "list-workspace-ssh", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listWorkspaceSsh(@ValidatorItem String id) { + public IJsonMessage> listWorkspaceSsh(@ValidatorItem String id) { MachineSshModel machineSshModel = machineSshServer.getByKey(id); Assert.notNull(machineSshModel, "没有对应的机器"); SshModel sshModel = new SshModel(); @@ -257,7 +252,7 @@ public class MachineSshController extends BaseGroupNameController { */ @PostMapping(value = "save-workspace-config", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage saveWorkspaceConfig( + public IJsonMessage saveWorkspaceConfig( String fileDirs, @ValidatorItem String id, String notAllowedCommand, @@ -295,7 +290,7 @@ public class MachineSshController extends BaseGroupNameController { */ @PostMapping(value = "distribute", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage distribute(@ValidatorItem String ids, @ValidatorItem String workspaceId) { + public IJsonMessage distribute(@ValidatorItem String ids, @ValidatorItem String workspaceId) { List list = StrUtil.splitTrim(ids, StrUtil.COMMA); for (String id : list) { MachineSshModel machineSshModel = machineSshServer.getByKey(id); @@ -320,7 +315,7 @@ public class MachineSshController extends BaseGroupNameController { */ @PostMapping(value = "rest-hide-field", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage restHideField(@ValidatorItem String id) { + public IJsonMessage restHideField(@ValidatorItem String id) { MachineSshModel machineSshModel = new MachineSshModel(); machineSshModel.setId(id); machineSshModel.setPassword(StrUtil.EMPTY); @@ -396,7 +391,7 @@ public class MachineSshController extends BaseGroupNameController { */ @PostMapping(value = "import-data", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage importData(MultipartFile file) throws IOException { + public IJsonMessage importData(MultipartFile file) throws IOException { Assert.notNull(file, "没有上传文件"); String originalFilename = file.getOriginalFilename(); String extName = FileUtil.extName(originalFilename); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/docker/AssetsDockerSwarmInfoController.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/docker/AssetsDockerSwarmInfoController.java index 94abb230c..b3903d104 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/docker/AssetsDockerSwarmInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/controller/docker/AssetsDockerSwarmInfoController.java @@ -22,8 +22,9 @@ */ package org.dromara.jpom.func.assets.controller.docker; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.controller.docker.base.BaseDockerSwarmInfoController; import org.dromara.jpom.func.assets.model.MachineDockerModel; import org.dromara.jpom.func.assets.server.MachineDockerServer; @@ -73,7 +74,7 @@ public class AssetsDockerSwarmInfoController extends BaseDockerSwarmInfoControll */ @GetMapping(value = "list-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listAll() { + public IJsonMessage> listAll() { MachineDockerModel machineDockerModel = new MachineDockerModel(); machineDockerModel.setSwarmControlAvailable(true); // load list with all diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineDockerModel.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineDockerModel.java index daabbafba..082d3ea3c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineDockerModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineDockerModel.java @@ -125,6 +125,17 @@ public class MachineDockerModel extends BaseGroupNameModel { */ private Boolean swarmControlAvailable; + /** + * 开启 SSH 访问 + */ + private Boolean enableSsh; + + /** + * SSH Id + */ + private String machineSshId; + + public void setFailureMsg(String failureMsg) { this.failureMsg = StrUtil.maxLength(failureMsg, 240); } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineSshModel.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineSshModel.java index 3ecb52273..a5056e61f 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineSshModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/model/MachineSshModel.java @@ -108,7 +108,7 @@ public class MachineSshModel extends BaseGroupNameModel implements ISshInfo { private String hostName; public void setHostName(String hostName) { - this.osName = StrUtil.maxLength(hostName, 240); + this.hostName = StrUtil.maxLength(hostName, 240); } /** diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineDockerServer.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineDockerServer.java index ad9c00581..438882c1d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineDockerServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineDockerServer.java @@ -33,15 +33,19 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.task.Task; import cn.hutool.db.Entity; +import cn.keepbx.jpom.event.IAsyncLoad; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; +import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; import org.dromara.jpom.common.ILoadEvent; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.IAsyncLoad; import org.dromara.jpom.func.assets.model.MachineDockerModel; +import org.dromara.jpom.func.assets.model.MachineSshModel; import org.dromara.jpom.func.cert.service.CertificateInfoService; +import org.dromara.jpom.func.system.model.ClusterInfoModel; +import org.dromara.jpom.func.system.service.ClusterInfoService; import org.dromara.jpom.model.docker.DockerInfoModel; import org.dromara.jpom.model.docker.DockerSwarmInfoMode; import org.dromara.jpom.plugin.PluginFactory; @@ -57,6 +61,7 @@ import javax.annotation.Resource; import java.io.File; import java.nio.file.NoSuchFileException; import java.util.*; +import java.util.function.Supplier; /** * @author bwcx_jzy @@ -66,18 +71,24 @@ import java.util.*; @Slf4j public class MachineDockerServer extends BaseDbService implements ILoadEvent, IAsyncLoad, Task { private static final String CRON_ID = "docker-monitor"; + private final MachineSshServer machineSshServer; private final DockerInfoService dockerInfoService; private final DockerSwarmInfoService dockerSwarmInfoService; + private final ClusterInfoService clusterInfoService; @Resource @Lazy private CertificateInfoService certificateInfoService; - public MachineDockerServer(DockerInfoService dockerInfoService, - DockerSwarmInfoService dockerSwarmInfoService) { + public MachineDockerServer(MachineSshServer machineSshServer, + DockerInfoService dockerInfoService, + DockerSwarmInfoService dockerSwarmInfoService, + ClusterInfoService clusterInfoService) { + this.machineSshServer = machineSshServer; this.dockerInfoService = dockerInfoService; this.dockerSwarmInfoService = dockerSwarmInfoService; + this.clusterInfoService = clusterInfoService; } @Override @@ -152,7 +163,17 @@ public class MachineDockerServer extends BaseDbService imple @Override public void execute() { - List list = this.list(false); + // 查询对应分组的数据 + ClusterInfoModel current = clusterInfoService.getCurrent(); + String linkGroup = current.getLinkGroup(); + List linkGroups = StrUtil.splitTrim(linkGroup, StrUtil.COMMA); + if (CollUtil.isEmpty(linkGroups)) { + log.warn("当前集群还未绑定分组,不能监控 Docker 资产信息"); + return; + } + Entity entity = new Entity(); + entity.set("groupName", linkGroups); + List list = this.listByEntity(entity, false); if (CollUtil.isEmpty(list)) { return; } @@ -170,6 +191,8 @@ public class MachineDockerServer extends BaseDbService imple */ public boolean updateMonitor(MachineDockerModel dockerInfoModel) { try { + DockerInfoModel model = new DockerInfoModel(); + model.setMachineDockerId(dockerInfoModel.getId()); IPlugin pluginCheck = PluginFactory.getPlugin(DockerInfoService.DOCKER_CHECK_PLUGIN_NAME); Map parameter = this.toParameter(dockerInfoModel); // @@ -405,6 +428,14 @@ public class MachineDockerServer extends BaseDbService imple Assert.notNull(filePath, "docker 证书文件丢失"); parameter.put("dockerCertPath", filePath.getAbsolutePath()); } + if (Boolean.TRUE.equals(machineDockerModel.getEnableSsh()) && StrUtil.isNotEmpty(machineDockerModel.getMachineSshId())) { + // 添加SSH的操作Session + MachineSshModel sshModel = machineSshServer.getByKey(machineDockerModel.getMachineSshId()); + Assert.notNull(sshModel, "ssh 信息不存在啦"); + // 需要关闭之前的连接,避免阻塞 + parameter.put("closeBefore", true); + parameter.put("session", (Supplier) () -> machineSshServer.getSessionByModel(sshModel)); + } return parameter; } } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineNodeServer.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineNodeServer.java index 9c0a56c18..0dbf71b22 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineNodeServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineNodeServer.java @@ -33,16 +33,21 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.event.IAsyncLoad; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; -import org.dromara.jpom.common.*; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.Const; +import org.dromara.jpom.common.ILoadEvent; +import org.dromara.jpom.common.JpomManifest; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.IAsyncLoad; import org.dromara.jpom.func.assets.model.MachineNodeModel; import org.dromara.jpom.func.assets.model.MachineNodeStatLogModel; +import org.dromara.jpom.func.system.service.ClusterInfoService; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.user.UserModel; import org.dromara.jpom.service.h2db.BaseDbService; @@ -60,7 +65,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -75,13 +79,18 @@ public class MachineNodeServer extends BaseDbService implement private final NodeService nodeService; private final ServerConfig.NodeConfig nodeConfig; private final MachineNodeStatLogServer machineNodeStatLogServer; + private final ClusterInfoService clusterInfoService; + + private static final String TASK_ID = "system_monitor_node"; public MachineNodeServer(NodeService nodeService, ServerConfig serverConfig, - MachineNodeStatLogServer machineNodeStatLogServer) { + MachineNodeStatLogServer machineNodeStatLogServer, + ClusterInfoService clusterInfoService) { this.nodeService = nodeService; this.nodeConfig = serverConfig.getNode(); this.machineNodeStatLogServer = machineNodeStatLogServer; + this.clusterInfoService = clusterInfoService; } @Override @@ -182,26 +191,33 @@ public class MachineNodeServer extends BaseDbService implement public void startLoad() { // 启动心跳检测 int heartSecond = nodeConfig.getHeartSecond(); - ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> new Thread(runnable, "Jpom Node Monitor")); - scheduler.scheduleAtFixedRate(this, 0, heartSecond, TimeUnit.SECONDS); - JpomApplication.register("node_monitor", scheduler); + ScheduledExecutorService scheduler = JpomApplication.getScheduledExecutorService(); + scheduler.scheduleWithFixedDelay(this, 0, heartSecond, TimeUnit.SECONDS); } @Override public void run() { - String id = "system_monitor_node"; + String linkGroup = clusterInfoService.getCurrent().getLinkGroup(); + List linkGroups = StrUtil.splitTrim(linkGroup, StrUtil.COMMA); + if (CollUtil.isEmpty(linkGroups)) { + log.warn("当前集群还未绑定分组,不能监控集群节点资产信息"); + return; + } + Entity entity = new Entity(); + entity.set("groupName", linkGroups); + entity.set("transportMode", 0); int heartSecond = nodeConfig.getHeartSecond(); try { - CronUtils.TaskStat taskStat = CronUtils.getTaskStat(id, StrUtil.format("{} 秒执行一次", heartSecond)); + CronUtils.TaskStat taskStat = CronUtils.getTaskStat(TASK_ID, StrUtil.format("{} 秒执行一次", heartSecond)); taskStat.onStart(); - MachineNodeModel machineNodeModel = new MachineNodeModel(); - machineNodeModel.setTransportMode(0); - List machineNodeModels = this.listByBean(machineNodeModel); + //MachineNodeModel machineNodeModel = new MachineNodeModel(); + //machineNodeModel.setTransportMode(0); + List machineNodeModels = this.listByEntity(entity); this.checkList(machineNodeModels); taskStat.onSucceeded(); } catch (Throwable throwable) { - CronUtils.TaskStat taskStat = CronUtils.getTaskStat(id, StrUtil.format("{} 秒执行一次", heartSecond)); - taskStat.onFailed(id, throwable); + CronUtils.TaskStat taskStat = CronUtils.getTaskStat(TASK_ID, StrUtil.format("{} 秒执行一次", heartSecond)); + taskStat.onFailed(TASK_ID, throwable); } } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineSshServer.java b/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineSshServer.java index fcf10a632..458fb3c78 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineSshServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/assets/server/MachineSshServer.java @@ -39,6 +39,7 @@ import cn.hutool.cron.task.Task; import cn.hutool.db.Entity; import cn.hutool.extra.ssh.JschUtil; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.event.IAsyncLoad; import com.alibaba.fastjson2.JSONObject; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; @@ -49,8 +50,8 @@ import org.dromara.jpom.common.Const; import org.dromara.jpom.common.ILoadEvent; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.IAsyncLoad; import org.dromara.jpom.func.assets.model.MachineSshModel; +import org.dromara.jpom.func.system.service.ClusterInfoService; import org.dromara.jpom.model.data.SshModel; import org.dromara.jpom.plugin.IWorkspaceEnvPlugin; import org.dromara.jpom.plugin.PluginFactory; @@ -84,9 +85,12 @@ public class MachineSshServer extends BaseDbService implements private SshService sshService; private final JpomApplication jpomApplication; + private final ClusterInfoService clusterInfoService; - public MachineSshServer(JpomApplication jpomApplication) { + public MachineSshServer(JpomApplication jpomApplication, + ClusterInfoService clusterInfoService) { this.jpomApplication = jpomApplication; + this.clusterInfoService = clusterInfoService; } @Override @@ -180,7 +184,15 @@ public class MachineSshServer extends BaseDbService implements @Override public void execute() { - List list = this.list(false); + String linkGroup = clusterInfoService.getCurrent().getLinkGroup(); + List linkGroups = StrUtil.splitTrim(linkGroup, StrUtil.COMMA); + if (CollUtil.isEmpty(linkGroups)) { + log.warn("当前集群还未绑定分组,不能监控 SSH 资产信息"); + return; + } + Entity entity = new Entity(); + entity.set("groupName", linkGroups); + List list = this.listByEntity(entity, false); if (CollUtil.isEmpty(list)) { return; } @@ -356,6 +368,13 @@ public class MachineSshServer extends BaseDbService implements * @return session */ public Session getSessionByModelNoFill(ISshInfo sshModel) { + String workspaceId = ServerConst.WORKSPACE_GLOBAL; + if (sshModel instanceof MachineSshModel) { + SshModel sshModel1 = sshService.getByMachineSshId(((MachineSshModel) sshModel).getId()); + if (sshModel1 != null) { + workspaceId = sshModel1.getWorkspaceId(); + } + } Assert.notNull(sshModel, "没有对应 SSH 信息"); Session session = null; int timeout = sshModel.timeout(); @@ -365,8 +384,8 @@ public class MachineSshServer extends BaseDbService implements // 转化密码字段 IWorkspaceEnvPlugin plugin = (IWorkspaceEnvPlugin) PluginFactory.getPlugin(IWorkspaceEnvPlugin.PLUGIN_NAME); try { - user = plugin.convertRefEnvValue(ServerConst.WORKSPACE_GLOBAL, user); - password = plugin.convertRefEnvValue(ServerConst.WORKSPACE_GLOBAL, password); + user = plugin.convertRefEnvValue(workspaceId, user); + password = plugin.convertRefEnvValue(workspaceId, password); } catch (Exception e) { throw Lombok.sneakyThrow(e); } @@ -400,7 +419,7 @@ public class MachineSshServer extends BaseDbService implements Assert.notNull(rsaFile, "用户目录没有找到私钥信息"); } else { //这里的实现,用于把 private key 写入到一个临时文件中,此方式不太采取 - File tempPath = JpomApplication.getInstance().getTempPath(); + File tempPath = jpomApplication.getTempPath(); String sshFile = StrUtil.emptyToDefault(sshModel.id(), IdUtil.fastSimpleUUID()); rsaFile = FileUtil.file(tempPath, "ssh", sshFile); FileUtil.writeString(privateKey, rsaFile, CharsetUtil.UTF_8); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/cert/controller/CertificateInfoController.java b/modules/server/src/main/java/org/dromara/jpom/func/cert/controller/CertificateInfoController.java index fa4274469..6e03b0bb8 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/cert/controller/CertificateInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/cert/controller/CertificateInfoController.java @@ -29,10 +29,11 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.crypto.KeyUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.controller.outgiving.OutGivingWhitelistService; @@ -108,7 +109,7 @@ public class CertificateInfoController extends BaseServerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(HttpServletRequest request) { + public IJsonMessage> list(HttpServletRequest request) { // PageResultDto listPage = certificateInfoService.listPage(request); listPage.each(certificateInfoModel -> { @@ -126,7 +127,7 @@ public class CertificateInfoController extends BaseServerController { @PostMapping(value = "list-all", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) @SystemPermission - public JsonMessage> listAll(HttpServletRequest request) { + public IJsonMessage> listAll(HttpServletRequest request) { // PageResultDto listPage = certificateInfoService.listPageAll(request); listPage.each(certificateInfoModel -> { @@ -138,7 +139,7 @@ public class CertificateInfoController extends BaseServerController { @PostMapping(value = "import-file", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage importFile(MultipartFile file, @ValidatorItem String type, String password) { + public IJsonMessage importFile(MultipartFile file, @ValidatorItem String type, String password) { Assert.notNull(file, "没有上传文件"); String filename = file.getOriginalFilename(); Assert.notNull(filename, "没有文件名"); @@ -282,7 +283,7 @@ public class CertificateInfoController extends BaseServerController { @GetMapping(value = "del", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(@ValidatorItem String id, HttpServletRequest request) throws IOException { + public IJsonMessage del(@ValidatorItem String id, HttpServletRequest request) throws IOException { CertificateInfoModel model = certificateInfoService.getByKeyAndGlobal(id, request); // 判断是否被 docker 使用 MachineDockerModel machineDockerModel = new MachineDockerModel(); @@ -303,7 +304,7 @@ public class CertificateInfoController extends BaseServerController { @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(@ValidatorItem String id, + public IJsonMessage edit(@ValidatorItem String id, String description, HttpServletRequest request) throws IOException { // 验证权限 @@ -343,7 +344,7 @@ public class CertificateInfoController extends BaseServerController { @PostMapping(value = "deploy", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage addTask(@ValidatorItem String id, + public IJsonMessage addTask(@ValidatorItem String id, @ValidatorItem String name, @ValidatorItem(value = ValidatorRule.NUMBERS) int taskType, @ValidatorItem String taskDataIds, diff --git a/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileReleaseTaskController.java b/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileReleaseTaskController.java index a5d9b70ca..e489903ee 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileReleaseTaskController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileReleaseTaskController.java @@ -24,9 +24,10 @@ package org.dromara.jpom.func.files.controller; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.common.validator.ValidatorRule; import org.dromara.jpom.controller.outgiving.OutGivingWhitelistService; @@ -75,7 +76,7 @@ public class FileReleaseTaskController extends BaseServerController { @PostMapping(value = "add-task", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage addTask(@ValidatorItem String fileId, + public IJsonMessage addTask(@ValidatorItem String fileId, @ValidatorItem String name, @ValidatorItem(value = ValidatorRule.NUMBERS) int taskType, @ValidatorItem String taskDataIds, @@ -98,14 +99,14 @@ public class FileReleaseTaskController extends BaseServerController { @PostMapping(value = "re-task", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage reTask(@ValidatorItem String fileId, - @ValidatorItem String name, - @ValidatorItem(value = ValidatorRule.NUMBERS) int taskType, - @ValidatorItem String taskDataIds, - @ValidatorItem String parentTaskId, - String beforeScript, - String afterScript, - HttpServletRequest request) { + public IJsonMessage reTask(@ValidatorItem String fileId, + @ValidatorItem String name, + @ValidatorItem(value = ValidatorRule.NUMBERS) int taskType, + @ValidatorItem String taskDataIds, + @ValidatorItem String parentTaskId, + String beforeScript, + String afterScript, + HttpServletRequest request) { FileReleaseTaskLogModel parentTask = fileReleaseTaskService.getByKey(parentTaskId, request); Assert.notNull(parentTask, "父任务不存在"); return fileReleaseTaskService.addTask(fileId, name, taskType, taskDataIds, parentTask.getReleasePath(), beforeScript, afterScript, null, request); @@ -118,7 +119,7 @@ public class FileReleaseTaskController extends BaseServerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(HttpServletRequest request) { + public IJsonMessage> list(HttpServletRequest request) { // PageResultDto listPage = fileReleaseTaskService.listPage(request); return JsonMessage.success("", listPage); @@ -132,7 +133,7 @@ public class FileReleaseTaskController extends BaseServerController { */ @GetMapping(value = "cancel-task", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage hasFile(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage hasFile(@ValidatorItem String id, HttpServletRequest request) { FileReleaseTaskLogModel taskLogModel = fileReleaseTaskService.getByKey(id, request); Assert.notNull(taskLogModel, "不存在对应的任务"); fileReleaseTaskService.cancelTask(taskLogModel.getId()); @@ -147,7 +148,7 @@ public class FileReleaseTaskController extends BaseServerController { */ @GetMapping(value = "details", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage details(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage details(@ValidatorItem String id, HttpServletRequest request) { FileReleaseTaskLogModel taskLogModel = fileReleaseTaskService.getByKey(id, request); Assert.notNull(taskLogModel, "不存在对应的任务"); JSONObject jsonObject = new JSONObject(); @@ -167,7 +168,7 @@ public class FileReleaseTaskController extends BaseServerController { */ @GetMapping(value = "delete", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage delete(@ValidatorItem String id, HttpServletRequest request) { + public IJsonMessage delete(@ValidatorItem String id, HttpServletRequest request) { FileReleaseTaskLogModel taskLogModel = fileReleaseTaskService.getByKey(id, request); Assert.notNull(taskLogModel, "不存在对应的任务"); @@ -200,7 +201,7 @@ public class FileReleaseTaskController extends BaseServerController { */ @GetMapping(value = "log-list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage log(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, + public IJsonMessage log(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "没有数据") String id, @ValidatorItem(value = ValidatorRule.POSITIVE_INTEGER, msg = "line") int line, HttpServletRequest request) { FileReleaseTaskLogModel item = fileReleaseTaskService.getByKey(id, request); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileStorageController.java b/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileStorageController.java index ac4f4b544..26f2c60a9 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileStorageController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/files/controller/FileStorageController.java @@ -28,7 +28,12 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; -import org.dromara.jpom.common.*; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; +import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.ServerOpenApi; +import org.dromara.jpom.common.UrlRedirectUtil; import org.dromara.jpom.common.validator.ValidatorItem; import org.dromara.jpom.controller.outgiving.OutGivingWhitelistService; import org.dromara.jpom.func.files.model.FileStorageModel; @@ -86,7 +91,7 @@ public class FileStorageController extends BaseServerController { */ @PostMapping(value = "list", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> list(HttpServletRequest request) { + public IJsonMessage> list(HttpServletRequest request) { File storageSavePath = serverConfig.fileStorageSavePath(); // PageResultDto listPage = fileStorageService.listPage(request); @@ -105,7 +110,7 @@ public class FileStorageController extends BaseServerController { */ @GetMapping(value = "has-file", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage hasFile(@ValidatorItem String fileSumMd5) { + public IJsonMessage hasFile(@ValidatorItem String fileSumMd5) { FileStorageModel storageModel = fileStorageService.getByKey(fileSumMd5); return JsonMessage.success("", storageModel); } @@ -123,7 +128,7 @@ public class FileStorageController extends BaseServerController { */ @PostMapping(value = "upload-sharding", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD, log = false) - public JsonMessage uploadSharding(MultipartFile file, + public IJsonMessage uploadSharding(MultipartFile file, String sliceId, Integer totalSlice, Integer nowSlice, @@ -144,7 +149,7 @@ public class FileStorageController extends BaseServerController { */ @PostMapping(value = "upload-sharding-merge", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.UPLOAD) - public JsonMessage uploadMerge(String sliceId, + public IJsonMessage uploadMerge(String sliceId, Integer totalSlice, String fileSumMd5, Integer keepDay, @@ -189,7 +194,7 @@ public class FileStorageController extends BaseServerController { @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage edit(@ValidatorItem String id, + public IJsonMessage edit(@ValidatorItem String id, @ValidatorItem String name, Integer keepDay, String description, @@ -213,7 +218,7 @@ public class FileStorageController extends BaseServerController { @GetMapping(value = "del", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.DEL) - public JsonMessage del(String id, String ids, HttpServletRequest request) throws IOException { + public IJsonMessage del(String id, String ids, HttpServletRequest request) throws IOException { this.delItem(id, request); List list = StrUtil.splitTrim(ids, StrUtil.COMMA); for (String s : list) { @@ -251,7 +256,7 @@ public class FileStorageController extends BaseServerController { */ @PostMapping(value = "remote-download", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.REMOTE_DOWNLOAD) - public JsonMessage download( + public IJsonMessage download( @ValidatorItem String url, Integer keepDay, String description, @@ -275,7 +280,7 @@ public class FileStorageController extends BaseServerController { */ @GetMapping(value = "trigger-url", produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.EDIT) - public JsonMessage> getTriggerUrl(@ValidatorItem String id, String rest, HttpServletRequest request) { + public IJsonMessage> getTriggerUrl(@ValidatorItem String id, String rest, HttpServletRequest request) { UserModel user = getUser(); // 查询当前工作空间 FileStorageModel item = fileStorageService.getByKey(id, request); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/files/model/FileReleaseTaskLogModel.java b/modules/server/src/main/java/org/dromara/jpom/func/files/model/FileReleaseTaskLogModel.java index 6364e6ea4..6461ca55c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/files/model/FileReleaseTaskLogModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/files/model/FileReleaseTaskLogModel.java @@ -33,7 +33,7 @@ import org.dromara.jpom.model.BaseWorkspaceModel; * @since 2023/3/18 */ @EqualsAndHashCode(callSuper = true) -@TableName(value = "FILE_RELEASE_TASK_LOG", name = "文件发布任务记录") +@TableName(value = "FILE_RELEASE_TASK_LOG", name = "文件发布任务记录", parents = FileStorageModel.class) @Data @NoArgsConstructor public class FileReleaseTaskLogModel extends BaseWorkspaceModel { diff --git a/modules/server/src/main/java/org/dromara/jpom/func/files/service/FileReleaseTaskService.java b/modules/server/src/main/java/org/dromara/jpom/func/files/service/FileReleaseTaskService.java index de2fd7129..ae9bce6db 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/files/service/FileReleaseTaskService.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/files/service/FileReleaseTaskService.java @@ -32,12 +32,13 @@ import cn.hutool.core.util.*; import cn.hutool.db.Entity; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.ssh.JschUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.JpomApplication; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.func.assets.model.MachineSshModel; @@ -56,7 +57,10 @@ import org.dromara.jpom.service.system.WorkspaceEnvVarService; import org.dromara.jpom.system.ServerConfig; import org.dromara.jpom.system.extconf.BuildExtConfig; import org.dromara.jpom.transport.*; -import org.dromara.jpom.util.*; +import org.dromara.jpom.util.LogRecorder; +import org.dromara.jpom.util.MySftp; +import org.dromara.jpom.util.StrictSyncFinisher; +import org.dromara.jpom.util.SyncFinisherUtil; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -132,15 +136,15 @@ public class FileReleaseTaskService extends BaseWorkspaceService addTask(String fileId, - String name, - int taskType, - String taskDataIds, - String releasePath, - String beforeScript, - String afterScript, - Map env, - HttpServletRequest request) { + public IJsonMessage addTask(String fileId, + String name, + int taskType, + String taskDataIds, + String releasePath, + String beforeScript, + String afterScript, + Map env, + HttpServletRequest request) { FileStorageModel storageModel = fileStorageService.getByKey(fileId, request); Assert.notNull(storageModel, "不存在对应的文件"); File storageSavePath = serverConfig.fileStorageSavePath(); @@ -184,7 +188,7 @@ public class FileReleaseTaskService extends BaseWorkspaceService env) { + private void startTask(String taskId, File storageSaveFile, Map env, FileStorageModel storageModel) { FileReleaseTaskLogModel taskRoot = this.getByKey(taskId); Assert.notNull(taskRoot, "没有找到父级任务"); // @@ -207,6 +211,8 @@ public class FileReleaseTaskService extends BaseWorkspaceService progressRangeList = ConcurrentHashMap.newKeySet((int) Math.floor((float) 100 / buildExtConfig.getLogReduceProgressRatio())); - JsonMessage jsonMessage = NodeForward.requestSharding(item, NodeUrl.Manage_File_Upload_Sharding2, data, storageSaveFile, + String name = storageModel.getName(); + name = StrUtil.wrapIfMissing(name, StrUtil.EMPTY, StrUtil.DOT + storageModel.getExtName()); + JsonMessage jsonMessage = NodeForward.requestSharding(item, NodeUrl.Manage_File_Upload_Sharding2, data, storageSaveFile, name, sliceData -> { sliceData.putAll(data); return NodeForward.request(item, NodeUrl.Manage_File_Sharding_Merge2, sliceData); @@ -423,6 +433,7 @@ public class FileReleaseTaskService extends BaseWorkspaceService trigger2(@PathVariable String id, @PathVariable String token, - HttpServletRequest request, - String delay, - String buildRemark, String useQueue) { + public IJsonMessage trigger2(@PathVariable String id, @PathVariable String token, + HttpServletRequest request, + String delay, + String buildRemark, String useQueue) { BuildInfoModel item = buildInfoService.getByKey(id); Assert.notNull(item, "没有对应数据"); UserModel userModel = this.triggerTokenLogServer.getUserByToken(token, buildInfoService.typeName()); @@ -175,7 +179,7 @@ public class BuildTriggerApiController extends BaseJpomController implements Ini * @return json */ @PostMapping(value = ServerOpenApi.BUILD_TRIGGER_BUILD_BATCH, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> triggerBatch(HttpServletRequest request) { + public IJsonMessage> triggerBatch(HttpServletRequest request) { String body = ServletUtil.getBody(request); if (StrUtil.isEmpty(body)) { return new JsonMessage<>(405, "请传入 body 参数"); @@ -227,7 +231,7 @@ public class BuildTriggerApiController extends BaseJpomController implements Ini } else { BaseServerController.resetInfo(userModel); // - JsonMessage start = buildExecuteService.start(id, userModel, delay, 1, buildRemark, parametersEnv); + IJsonMessage start = buildExecuteService.start(id, userModel, delay, 1, buildRemark, parametersEnv); jsonObject.put("msg", start.getMsg()); jsonObject.put("buildId", start.getData()); } @@ -289,7 +293,7 @@ public class BuildTriggerApiController extends BaseJpomController implements Ini * @return json */ @GetMapping(value = ServerOpenApi.BUILD_TRIGGER_STATUS, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage buildStatusGet(@ValidatorItem String id, @ValidatorItem String token) { + public IJsonMessage buildStatusGet(@ValidatorItem String id, @ValidatorItem String token) { JSONObject statusData = this.getStatusData(id, token); return JsonMessage.success("", statusData); } @@ -333,7 +337,7 @@ public class BuildTriggerApiController extends BaseJpomController implements Ini * @return json */ @PostMapping(value = ServerOpenApi.BUILD_TRIGGER_STATUS, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> buildStatusPost(HttpServletRequest request) { + public IJsonMessage> buildStatusPost(HttpServletRequest request) { try { String body = ServletUtil.getBody(request); JSONArray jsonArray = JSONArray.parseArray(body); @@ -405,10 +409,9 @@ public class BuildTriggerApiController extends BaseJpomController implements Ini } @Override - public void afterPropertiesSet() throws Exception { - ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> new Thread(runnable, "Jpom Build Trigger Queue")); - scheduler.scheduleAtFixedRate(this, 0, 5, TimeUnit.SECONDS); - JpomApplication.register("build_trigger_queue", scheduler); + public void startLoad() { + ScheduledExecutorService scheduler = JpomApplication.getScheduledExecutorService(); + scheduler.scheduleWithFixedDelay(this, 0, 5, TimeUnit.SECONDS); } @Override @@ -460,7 +463,7 @@ public class BuildTriggerApiController extends BaseJpomController implements Ini } try { BaseServerController.resetInfo(cache.userModel); - JsonMessage message = buildExecuteService.start(cache.id, cache.userModel, cache.delay, 1, cache.buildRemark, cache.parametersEnv); + IJsonMessage message = buildExecuteService.start(cache.id, cache.userModel, cache.delay, 1, cache.buildRemark, cache.parametersEnv); log.info("构建触发器队列执行结果:{}", message); } catch (Exception e) { log.error("创建构建任务异常", e); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeInfoController.java b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeInfoController.java index a1689065f..94ad3329c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeInfoController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeInfoController.java @@ -27,11 +27,12 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.net.NetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.JpomManifest; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.common.interceptor.NotLogin; import org.dromara.jpom.common.validator.ValidatorItem; @@ -81,13 +82,13 @@ public class NodeInfoController extends BaseServerController { */ @RequestMapping(value = ServerOpenApi.RECEIVE_PUSH, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @NotLogin - public JsonMessage receivePush(@ValidatorItem(msg = "token empty") String token, - @ValidatorItem(msg = "ips empty") String ips, - @ValidatorItem(msg = "loginName empty") String loginName, - @ValidatorItem(msg = "loginPwd empty") String loginPwd, - @ValidatorItem(msg = "workspaceId empty") String workspaceId, - @ValidatorItem(value = ValidatorRule.NUMBERS, msg = "port error") int port, - String ping) { + public IJsonMessage receivePush(@ValidatorItem(msg = "token empty") String token, + @ValidatorItem(msg = "ips empty") String ips, + @ValidatorItem(msg = "loginName empty") String loginName, + @ValidatorItem(msg = "loginPwd empty") String loginPwd, + @ValidatorItem(msg = "workspaceId empty") String workspaceId, + @ValidatorItem(value = ValidatorRule.NUMBERS, msg = "port error") int port, + String ping) { Assert.state(StrUtil.equals(token, JpomManifest.getInstance().randomIdSign()), "token error"); boolean exists = workspaceService.exists(new WorkspaceModel(workspaceId)); Assert.state(exists, "workspaceId error"); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeScriptTriggerApiController.java b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeScriptTriggerApiController.java index 881c688e0..10b61376d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeScriptTriggerApiController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/NodeScriptTriggerApiController.java @@ -24,11 +24,12 @@ package org.dromara.jpom.func.openapi.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseJpomController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; @@ -81,7 +82,7 @@ public class NodeScriptTriggerApiController extends BaseJpomController { * @return json */ @RequestMapping(value = ServerOpenApi.NODE_SCRIPT_TRIGGER_URL, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage trigger2(@PathVariable String id, @PathVariable String token) { + public IJsonMessage trigger2(@PathVariable String id, @PathVariable String token) { NodeScriptCacheModel item = nodeScriptServer.getByKey(id); Assert.notNull(item, "没有对应数据"); Assert.state(StrUtil.equals(token, item.getTriggerToken()), "触发token错误,或者已经失效"); @@ -133,7 +134,7 @@ public class NodeScriptTriggerApiController extends BaseJpomController { * @return json */ @PostMapping(value = ServerOpenApi.NODE_SCRIPT_TRIGGER_BATCH, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> triggerBatch(HttpServletRequest request) { + public IJsonMessage> triggerBatch(HttpServletRequest request) { try { String body = ServletUtil.getBody(request); JSONArray jsonArray = JSONArray.parseArray(body); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ProjectTriggerApiController.java b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ProjectTriggerApiController.java index 75d225bfe..975790921 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ProjectTriggerApiController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ProjectTriggerApiController.java @@ -24,11 +24,12 @@ package org.dromara.jpom.func.openapi.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseJpomController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; @@ -103,7 +104,7 @@ public class ProjectTriggerApiController extends BaseJpomController { * @return json */ @RequestMapping(value = ServerOpenApi.SERVER_PROJECT_TRIGGER_URL, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage trigger(@PathVariable String id, @PathVariable String token, String action) { + public IJsonMessage trigger(@PathVariable String id, @PathVariable String token, String action) { ProjectInfoCacheModel item = projectInfoCacheService.getByKey(id); Assert.notNull(item, "没有对应数据"); Assert.state(StrUtil.equals(token, item.getTriggerToken()), "触发token错误,或者已经失效"); @@ -145,7 +146,7 @@ public class ProjectTriggerApiController extends BaseJpomController { * @return json */ @PostMapping(value = ServerOpenApi.SERVER_PROJECT_TRIGGER_BATCH, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> triggerBatch(HttpServletRequest request) { + public IJsonMessage> triggerBatch(HttpServletRequest request) { try { String body = ServletUtil.getBody(request); JSONArray jsonArray = JSONArray.parseArray(body); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ServerScriptTriggerApiController.java b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ServerScriptTriggerApiController.java index 9868df3bc..39c6c2eb5 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ServerScriptTriggerApiController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/ServerScriptTriggerApiController.java @@ -24,12 +24,13 @@ package org.dromara.jpom.func.openapi.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseJpomController; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.common.interceptor.NotLogin; import org.dromara.jpom.model.script.ScriptExecuteLogModel; @@ -83,7 +84,7 @@ public class ServerScriptTriggerApiController extends BaseJpomController { * @return json */ @RequestMapping(value = ServerOpenApi.SERVER_SCRIPT_TRIGGER_URL, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage trigger2(@PathVariable String id, @PathVariable String token) { + public IJsonMessage trigger2(@PathVariable String id, @PathVariable String token) { ScriptModel item = scriptServer.getByKey(id); Assert.notNull(item, "没有对应数据"); Assert.state(StrUtil.equals(token, item.getTriggerToken()), "触发token错误,或者已经失效"); @@ -139,7 +140,7 @@ public class ServerScriptTriggerApiController extends BaseJpomController { * @return json */ @PostMapping(value = ServerOpenApi.SERVER_SCRIPT_TRIGGER_BATCH, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> triggerBatch(HttpServletRequest request) { + public IJsonMessage> triggerBatch(HttpServletRequest request) { try { String body = ServletUtil.getBody(request); JSONArray jsonArray = JSONArray.parseArray(body); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/SshCommandTriggerApiController.java b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/SshCommandTriggerApiController.java index 787b6b423..b86ee51cd 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/SshCommandTriggerApiController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/openapi/controller/SshCommandTriggerApiController.java @@ -24,12 +24,13 @@ package org.dromara.jpom.func.openapi.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseJpomController; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerOpenApi; import org.dromara.jpom.common.interceptor.NotLogin; import org.dromara.jpom.model.data.CommandModel; @@ -75,7 +76,7 @@ public class SshCommandTriggerApiController extends BaseJpomController { * @return json */ @RequestMapping(value = ServerOpenApi.SSH_COMMAND_TRIGGER_URL, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage trigger2(@PathVariable String id, @PathVariable String token) { + public IJsonMessage trigger2(@PathVariable String id, @PathVariable String token) { CommandModel item = commandService.getByKey(id); Assert.notNull(item, "没有对应数据"); Assert.state(StrUtil.equals(token, item.getTriggerToken()), "触发token错误,或者已经失效"); @@ -121,7 +122,7 @@ public class SshCommandTriggerApiController extends BaseJpomController { * @return json */ @PostMapping(value = ServerOpenApi.SSH_COMMAND_TRIGGER_BATCH, produces = MediaType.APPLICATION_JSON_VALUE) - public JsonMessage> triggerBatch(HttpServletRequest request) { + public IJsonMessage> triggerBatch(HttpServletRequest request) { try { String body = ServletUtil.getBody(request); JSONArray jsonArray = JSONArray.parseArray(body); diff --git a/modules/server/src/main/java/org/dromara/jpom/func/system/controller/ClusterInfoController.java b/modules/server/src/main/java/org/dromara/jpom/func/system/controller/ClusterInfoController.java new file mode 100644 index 000000000..a789d2172 --- /dev/null +++ b/modules/server/src/main/java/org/dromara/jpom/func/system/controller/ClusterInfoController.java @@ -0,0 +1,213 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.dromara.jpom.func.system.controller; + +import cn.hutool.core.lang.Validator; +import cn.hutool.core.net.url.UrlBuilder; +import cn.hutool.core.stream.CollectorUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.Method; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.common.validator.ValidatorItem; +import org.dromara.jpom.common.validator.ValidatorRule; +import org.dromara.jpom.func.system.model.ClusterInfoModel; +import org.dromara.jpom.func.system.service.ClusterInfoService; +import org.dromara.jpom.model.PageResultDto; +import org.dromara.jpom.model.data.WorkspaceModel; +import org.dromara.jpom.permission.ClassFeature; +import org.dromara.jpom.permission.Feature; +import org.dromara.jpom.permission.MethodFeature; +import org.dromara.jpom.permission.SystemPermission; +import org.dromara.jpom.service.system.WorkspaceService; +import org.springframework.http.MediaType; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author bwcx_jzy + * @since 2023/8/20 + */ +@RestController +@RequestMapping(value = "/cluster/") +@Feature(cls = ClassFeature.CLUSTER_INFO) +@SystemPermission() +@Slf4j +public class ClusterInfoController { + + private final ClusterInfoService clusterInfoService; + private final WorkspaceService workspaceService; + + public ClusterInfoController(ClusterInfoService clusterInfoService, + WorkspaceService workspaceService) { + this.clusterInfoService = clusterInfoService; + this.workspaceService = workspaceService; + } + + /** + * 分页列表 + * + * @return json + */ + @PostMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.LIST) + public IJsonMessage> list(HttpServletRequest request) { + PageResultDto listPage = clusterInfoService.listPage(request); + return JsonMessage.success("", listPage); + } + + @GetMapping(value = "list-all", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.LIST) + public IJsonMessage> listAll() { + List list = clusterInfoService.list(); + return JsonMessage.success("", list); + } + + /** + * 查询所有可以管理的分组名 + * + * @return json + */ + @GetMapping(value = "list-link-groups") + @Feature(method = MethodFeature.LIST) + public IJsonMessage listLinkGroups() { + // + List all = clusterInfoService.listLinkGroups(); + // 查询集群已经绑定的分组 + List list = clusterInfoService.list(); + Map> map = list.stream() + .map(clusterInfoModel -> { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", clusterInfoModel.getName()); + jsonObject.put("id", clusterInfoModel.getId()); + jsonObject.put("linkGroup", clusterInfoModel.getLinkGroup()); + return jsonObject; + }) + .flatMap((Function>) jsonObject -> { + String string = jsonObject.getString("linkGroup"); + List list1 = StrUtil.splitTrim(string, StrUtil.COMMA); + return list1.stream() + .map(s -> { + JSONObject clone = jsonObject.clone(); + clone.remove("linkGroup"); + clone.put("group", s); + return clone; + }); + }) + .collect(CollectorUtil.groupingBy(o -> o.getString("group"), Collectors.toList())); + // + JSONObject jsonObject = new JSONObject(); + jsonObject.put("linkGroups", all); + jsonObject.put("groupMap", map); + + return JsonMessage.success("", jsonObject); + } + + /** + * 修改集群 + * + * @param id ID + * @return json + */ + @PostMapping(value = "edit", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.EDIT) + public IJsonMessage edit(@ValidatorItem(msg = "数据 id 不能为空") String id, + @ValidatorItem(msg = "请填写集群名称") String name, + @ValidatorItem(msg = "请填写集群访问地址") String url, + @ValidatorItem(msg = "请选择关联分组") String linkGroup) { + Validator.validateUrl(url, "请填写正确的 url"); + // + UrlBuilder urlBuilder = UrlBuilder.ofHttp(url); + urlBuilder.addPath(ServerConst.CHECK_SYSTEM); + HttpRequest httpRequest = HttpRequest.of(urlBuilder).method(Method.GET); + try { + JSONObject jsonObject = httpRequest.thenFunction(httpResponse -> { + String body = httpResponse.body(); + return JSONObject.parseObject(body); + }); + int code = jsonObject.getIntValue(JsonMessage.CODE); + Assert.state(code == JsonMessage.DEFAULT_SUCCESS_CODE, () -> { + String msg = jsonObject.getString(JsonMessage.MSG); + msg = StrUtil.emptyToDefault(msg, jsonObject.toString()); + return "集群状态码异常:" + code + " " + msg; + }); + // + JSONObject data = jsonObject.getJSONObject("data"); + Assert.notNull(data, "集群响应信息不正确,请确认集群地址是正确的服务端地址"); + Assert.state(data.containsKey("routerBase") && data.containsKey("extendPlugins"), "填写的集群地址不正确"); + } catch (Exception e) { + log.error("检查集群信息异常", e); + throw new IllegalArgumentException("填写的集群地址检查异常,请确认集群地址是正确的服务端地址," + e.getMessage()); + } + // + List list = StrUtil.splitTrim(linkGroup, StrUtil.COMMA); + Assert.notEmpty(list, "请选择关联的分组"); + // + ClusterInfoModel infoModel = new ClusterInfoModel(); + infoModel.setId(id); + infoModel.setName(name); + infoModel.setLinkGroup(linkGroup); + infoModel.setUrl(url); + clusterInfoService.updateById(infoModel); + return JsonMessage.success("修改成功"); + } + + + /** + * 删除集群 + * + * @param id ID + * @return json + */ + @GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE) + @Feature(method = MethodFeature.DEL) + @SystemPermission(superUser = true) + public IJsonMessage delete(@ValidatorItem(value = ValidatorRule.NOT_BLANK, msg = "数据 id 不能为空") String id) { + // + ClusterInfoModel infoModel = clusterInfoService.getByKey(id); + Assert.notNull(infoModel, "对应的集群不存在"); + Assert.state(!clusterInfoService.online(infoModel), "不能删除在线的集群"); + // 如果还有工作空间绑定,不能删除集群 + WorkspaceModel workspaceModel = new WorkspaceModel(); + workspaceModel.setClusterInfoId(infoModel.getId()); + long count = workspaceService.count(workspaceModel); + Assert.state(count == 0, "当前集群还被工作空间绑定不能删除"); + // + clusterInfoService.delByKey(id); + return JsonMessage.success("删除成功"); + } +} diff --git a/modules/common/src/main/java/org/dromara/jpom/model/BaseIdModel.java b/modules/server/src/main/java/org/dromara/jpom/func/system/model/ClusterInfoModel.java similarity index 63% rename from modules/common/src/main/java/org/dromara/jpom/model/BaseIdModel.java rename to modules/server/src/main/java/org/dromara/jpom/func/system/model/ClusterInfoModel.java index 31f49c72e..734fcf726 100644 --- a/modules/common/src/main/java/org/dromara/jpom/model/BaseIdModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/system/model/ClusterInfoModel.java @@ -20,27 +20,47 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package org.dromara.jpom.model; +package org.dromara.jpom.func.system.model; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.jpom.db.TableName; +import org.dromara.jpom.model.BaseUserModifyDbModel; /** - * 基础实体(带id) - * * @author bwcx_jzy - * @since 2022/01/24 + * @since 2023/8/19 */ @EqualsAndHashCode(callSuper = true) +@TableName(value = "CLUSTER_INFO", name = "集群信息") @Data -public abstract class BaseIdModel extends BaseJsonModel { - /** - * 主键 - */ - private String id; - - @Override - public String toString() { - return super.toString(); - } +public class ClusterInfoModel extends BaseUserModifyDbModel { + /** + * 集群Id + */ + private String clusterId; + /** + * 集群名称 + */ + private String name; + /** + * 集群地址 + */ + private String url; + /** + * 集群关联的分组 + */ + private String linkGroup; + /** + * 最后心跳时间 + */ + private Long lastHeartbeat; + /** + * 主机名 + */ + private String localHostName; + /** + * jpom 版本 + */ + private String jpomVersion; } diff --git a/modules/server/src/main/java/org/dromara/jpom/func/system/service/ClusterInfoService.java b/modules/server/src/main/java/org/dromara/jpom/func/system/service/ClusterInfoService.java new file mode 100644 index 000000000..09913d68f --- /dev/null +++ b/modules/server/src/main/java/org/dromara/jpom/func/system/service/ClusterInfoService.java @@ -0,0 +1,219 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.dromara.jpom.func.system.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.SystemClock; +import cn.hutool.core.net.NetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.db.Entity; +import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.event.IAsyncLoad; +import lombok.extern.slf4j.Slf4j; +import org.dromara.jpom.JpomApplication; +import org.dromara.jpom.common.JpomManifest; +import org.dromara.jpom.cron.CronUtils; +import org.dromara.jpom.func.assets.server.MachineDockerServer; +import org.dromara.jpom.func.assets.server.MachineNodeServer; +import org.dromara.jpom.func.assets.server.MachineSshServer; +import org.dromara.jpom.func.system.model.ClusterInfoModel; +import org.dromara.jpom.model.user.UserModel; +import org.dromara.jpom.service.h2db.BaseDbService; +import org.dromara.jpom.service.system.WorkspaceService; +import org.dromara.jpom.system.ServerConfig; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author bwcx_jzy + * @since 2023/8/19 + */ +@Service +@Slf4j +public class ClusterInfoService extends BaseDbService implements IAsyncLoad, Runnable { + + + private final ServerConfig.ClusterConfig clusterConfig; + private static final String TASK_ID = "system_monitor_cluster"; + + private final WorkspaceService workspaceService; + + public ClusterInfoService(ServerConfig serverConfig, + WorkspaceService workspaceService) { + this.clusterConfig = serverConfig.getCluster(); + this.workspaceService = workspaceService; + } + + /** + * 获取当前集群 + * + * @return 集群信息 + */ + public ClusterInfoModel getCurrent() { + ClusterInfoModel clusterInfoModel = this.getByKey(JpomManifest.getInstance().getInstallId()); + Assert.notNull(clusterInfoModel, "当前集群不存在"); + return clusterInfoModel; + } + + @Override + public void startLoad() { + // 启动心跳检测 + int heartSecond = clusterConfig.getHeartSecond(); + ScheduledExecutorService scheduler = JpomApplication.getScheduledExecutorService(); + scheduler.scheduleWithFixedDelay(this, 0, heartSecond, TimeUnit.SECONDS); + } + + @Override + public void run() { + int heartSecond = clusterConfig.getHeartSecond(); + try { + CronUtils.TaskStat taskStat = CronUtils.getTaskStat(TASK_ID, StrUtil.format("{} 秒执行一次", heartSecond)); + taskStat.onStart(); + // + JpomManifest jpomManifest = JpomManifest.getInstance(); + String installId = jpomManifest.getInstallId(); + ClusterInfoModel byKey = this.getByKey(installId); + if (byKey == null) { + // 初始安装 + this.insert(this.createDefault(installId)); + // 自动绑定默认数据 + this.bindDefault(installId); + return; + } + // 更新数据 + ClusterInfoModel clusterInfoModel = new ClusterInfoModel(); + clusterInfoModel.setId(byKey.getId()); + if (!StrUtil.equals(byKey.getClusterId(), clusterConfig.getId())) { + log.warn("集群ID 发生变化:{} -> {}", byKey.getClusterId(), clusterConfig.getId()); + clusterInfoModel.setClusterId(clusterConfig.getId()); + } + clusterInfoModel.setLocalHostName(NetUtil.getLocalHostName()); + clusterInfoModel.setLastHeartbeat(SystemClock.now()); + clusterInfoModel.setJpomVersion(jpomManifest.getVersion()); + this.updateById(clusterInfoModel); + // 检查是否重复 + Entity entity = Entity.create(); + entity.set("clusterId", clusterConfig.getId()); + entity.set("id", StrUtil.format(" <> {}", installId)); + List clusterInfoModels = this.listByEntity(entity); + if (CollUtil.isNotEmpty(clusterInfoModels)) { + for (ClusterInfoModel infoModel : clusterInfoModels) { + log.error("{} 集群ID冲突:{} {}", clusterConfig.getId(), infoModel.getId(), infoModel.getName()); + } + } + // 通知任务结束 + taskStat.onSucceeded(); + } catch (Throwable throwable) { + CronUtils.TaskStat taskStat = CronUtils.getTaskStat(TASK_ID, StrUtil.format("{} 秒执行一次", heartSecond)); + taskStat.onFailed(TASK_ID, throwable); + } + } + + /** + * 自动帮忙集群相关的默认数据 + * + * @param installId 安装Id + */ + private void bindDefault(String installId) { + long count = this.count(); + if (count != 1) { + log.debug("系统中存在多个集群,不需要自动绑定数据"); + return; + } + // 所以工作空间自动绑定集群Id + String sql = "update " + workspaceService.getTableName() + " set clusterInfoId=?"; + workspaceService.execute(sql, installId); + // 获取所有的资产分组 + List list = this.listLinkGroups(); + String join = CollUtil.join(list, StrUtil.COMMA); + // + ClusterInfoModel clusterInfoModel = new ClusterInfoModel(); + clusterInfoModel.setId(installId); + clusterInfoModel.setLinkGroup(join); + this.updateById(clusterInfoModel); + } + + /** + * 查询集群可以管理的分组名 + * + * @return list + */ + public List listLinkGroups() { + MachineDockerServer machineDockerServer = SpringUtil.getBean(MachineDockerServer.class); + MachineNodeServer machineNodeServer = SpringUtil.getBean(MachineNodeServer.class); + MachineSshServer machineSshServer = SpringUtil.getBean(MachineSshServer.class); + List nodeGroup = machineNodeServer.listGroupName(); + List sshGroup = machineSshServer.listGroupName(); + List dockerGroup = machineDockerServer.listGroupName(); + // + List all = new ArrayList<>(); + CollUtil.addAll(all, nodeGroup); + CollUtil.addAll(all, sshGroup); + CollUtil.addAll(all, dockerGroup); + // + all = all.stream() + .distinct() + .collect(Collectors.toList()); + return all; + } + + /** + * 创建默认的集群数据 + * + * @param installId 系统安装 id + * @return 默认数据 + */ + private ClusterInfoModel createDefault(String installId) { + ClusterInfoModel clusterInfoModel = new ClusterInfoModel(); + clusterInfoModel.setId(installId); + clusterInfoModel.setName("默认集群"); + clusterInfoModel.setCreateUser(UserModel.SYSTEM_ADMIN); + clusterInfoModel.setClusterId(clusterConfig.getId()); + clusterInfoModel.setLastHeartbeat(SystemClock.now()); + return clusterInfoModel; + } + + /** + * 判断集群是否在线 + * + * @param clusterInfoModel 集群信息 + * @return true 在线 + */ + public boolean online(ClusterInfoModel clusterInfoModel) { + if (clusterInfoModel == null) { + return false; + } + Long lastHeartbeat = clusterInfoModel.getLastHeartbeat(); + if (lastHeartbeat == null) { + return false; + } + long millis = TimeUnit.SECONDS.toMillis(clusterConfig.getHeartSecond()); + return lastHeartbeat > SystemClock.now() - millis; + } +} diff --git a/modules/server/src/main/java/org/dromara/jpom/func/user/controller/UserLoginLogController.java b/modules/server/src/main/java/org/dromara/jpom/func/user/controller/UserLoginLogController.java index 3f8bdd3bd..ac46f12ee 100644 --- a/modules/server/src/main/java/org/dromara/jpom/func/user/controller/UserLoginLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/func/user/controller/UserLoginLogController.java @@ -22,8 +22,9 @@ */ package org.dromara.jpom.func.user.controller; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.func.user.model.UserLoginLogModel; import org.dromara.jpom.func.user.server.UserLoginLogServer; import org.dromara.jpom.model.PageResultDto; @@ -61,7 +62,7 @@ public class UserLoginLogController extends BaseServerController { */ @RequestMapping(value = "list-data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @Feature(method = MethodFeature.LIST) - public JsonMessage> listData(HttpServletRequest request) { + public IJsonMessage> listData(HttpServletRequest request) { PageResultDto pageResult = userLoginLogServer.listPage(request); return JsonMessage.success("", pageResult); } diff --git a/modules/server/src/main/java/org/dromara/jpom/model/BaseWorkspaceModel.java b/modules/server/src/main/java/org/dromara/jpom/model/BaseWorkspaceModel.java index 36757023d..ce3362685 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/BaseWorkspaceModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/BaseWorkspaceModel.java @@ -28,9 +28,11 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.jpom.common.Const; import org.dromara.jpom.common.ServerConst; +import org.dromara.jpom.db.TableName; import org.dromara.jpom.model.data.WorkspaceModel; import java.util.Set; +import java.util.stream.Collectors; /** * 工作空间 数据 @@ -65,8 +67,19 @@ public abstract class BaseWorkspaceModel extends BaseUserModifyDbModel { * @return set */ public static Set> allClass() { - Set> classes1 = ClassUtil.scanPackageBySuper("org.dromara.jpom", BaseWorkspaceModel.class); - return classes1; + return ClassUtil.scanPackageBySuper("org.dromara.jpom", BaseWorkspaceModel.class); + } + + /** + * 所有实现过的 class + * + * @return set + */ + public static Set> allTableClass() { + Set> classes1 = allClass(); + return classes1.stream() + .filter(aClass -> aClass.isAnnotationPresent(TableName.class)) + .collect(Collectors.toSet()); } } diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/BuildInfoModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/BuildInfoModel.java index 399edb3c3..123e0154e 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/BuildInfoModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/BuildInfoModel.java @@ -23,6 +23,7 @@ package org.dromara.jpom.model.data; import cn.hutool.core.annotation.PropIgnore; +import cn.hutool.core.util.ObjectUtil; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @@ -140,6 +141,14 @@ public class BuildInfoModel extends BaseGroupModel { * 别名码 */ private String aliasCode; + /** + * 产物保留天数 + */ + private Integer resultKeepDay; + + public Integer getResultKeepDay() { + return ObjectUtil.defaultIfNull(this.resultKeepDay, 0); + } @Tolerate public BuildInfoModel() { diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/CommandExecLogModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/CommandExecLogModel.java index a6a86b4c8..d0eec76eb 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/CommandExecLogModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/CommandExecLogModel.java @@ -38,7 +38,7 @@ import java.io.File; * @author bwcx_jzy * @since 2021/12/22 */ -@TableName(value = "COMMAND_EXEC_LOG", name = "命令执行记录") +@TableName(value = "COMMAND_EXEC_LOG", name = "命令执行记录", parents = CommandModel.class) @Data @EqualsAndHashCode(callSuper = true) public class CommandExecLogModel extends BaseWorkspaceModel { diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/MailAccountModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/MailAccountModel.java index 1b1580bb3..e1c7cc2b1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/MailAccountModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/MailAccountModel.java @@ -23,9 +23,9 @@ package org.dromara.jpom.model.data; import cn.hutool.core.util.ObjectUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.jpom.model.BaseJsonModel; /** * 系统邮箱配置 diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/MonitorModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/MonitorModel.java index 38732c1bc..b6269ef3e 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/MonitorModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/MonitorModel.java @@ -23,13 +23,13 @@ package org.dromara.jpom.model.data; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import com.alibaba.fastjson2.JSON; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; import org.dromara.jpom.db.TableName; import org.dromara.jpom.model.BaseEnum; -import org.dromara.jpom.model.BaseJsonModel; import org.dromara.jpom.model.BaseWorkspaceModel; import org.dromara.jpom.util.StringUtil; diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/NodeModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/NodeModel.java index 012f1bde6..8c0766c9c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/NodeModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/NodeModel.java @@ -35,6 +35,7 @@ import org.dromara.jpom.model.BaseMachineModel; * * @author bwcx_jzy * @since 2019/4/16 + * @see MachineNodeModel */ @EqualsAndHashCode(callSuper = true) @TableName(value = "NODE_INFO", name = "节点信息") diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/RepositoryModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/RepositoryModel.java index a7c43028f..6bf266730 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/RepositoryModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/RepositoryModel.java @@ -32,7 +32,7 @@ import org.dromara.jpom.build.BuildUtil; import org.dromara.jpom.common.Const; import org.dromara.jpom.db.TableName; import org.dromara.jpom.model.BaseEnum; -import org.dromara.jpom.model.BaseWorkspaceModel; +import org.dromara.jpom.model.BaseGroupModel; import org.dromara.jpom.model.enums.GitProtocolEnum; import java.util.HashMap; @@ -45,7 +45,7 @@ import java.util.Map; @TableName(value = "REPOSITORY", name = "仓库信息") @Data @EqualsAndHashCode(callSuper = true) -public class RepositoryModel extends BaseWorkspaceModel { +public class RepositoryModel extends BaseGroupModel { /** * 名称 */ diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/ServerWhitelist.java b/modules/server/src/main/java/org/dromara/jpom/model/data/ServerWhitelist.java index 076c9203b..26eba0b20 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/ServerWhitelist.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/ServerWhitelist.java @@ -24,9 +24,9 @@ package org.dromara.jpom.model.data; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.jpom.model.BaseJsonModel; import org.springframework.util.Assert; import java.util.List; diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/SystemIpConfigModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/SystemIpConfigModel.java index 272272ec6..53b5a17a2 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/SystemIpConfigModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/SystemIpConfigModel.java @@ -22,7 +22,7 @@ */ package org.dromara.jpom.model.data; -import org.dromara.jpom.model.BaseJsonModel; +import cn.keepbx.jpom.model.BaseJsonModel; /** * @author bwcx_jzy diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceEnvVarModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceEnvVarModel.java index 1af4b05d4..6e2a158eb 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceEnvVarModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceEnvVarModel.java @@ -34,7 +34,7 @@ import org.dromara.jpom.model.BaseWorkspaceModel; * @since 2021/12/10 */ @EqualsAndHashCode(callSuper = true) -@TableName(value = "WORKSPACE_ENV_VAR", name = "工作空间环境变量") +@TableName(value = "WORKSPACE_ENV_VAR", name = "工作空间环境变量", workspaceBind = 2) @Data public class WorkspaceEnvVarModel extends BaseWorkspaceModel { diff --git a/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceModel.java b/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceModel.java index 5f1a3d60d..352060f66 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/data/WorkspaceModel.java @@ -49,11 +49,16 @@ public class WorkspaceModel extends BaseUserModifyDbModel { * 描述 */ private String description; - /** * 分组 */ private String group; + /** + * 集群信息Id + * + * @see org.dromara.jpom.func.system.model.ClusterInfoModel + */ + private String clusterInfoId; public WorkspaceModel(String id) { this.setId(id); diff --git a/modules/server/src/main/java/org/dromara/jpom/model/log/BuildHistoryLog.java b/modules/server/src/main/java/org/dromara/jpom/model/log/BuildHistoryLog.java index 4ae779eab..d3ee86690 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/log/BuildHistoryLog.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/log/BuildHistoryLog.java @@ -41,7 +41,7 @@ import org.dromara.jpom.model.enums.BuildStatus; * @since 2019/7/17 **/ @EqualsAndHashCode(callSuper = true) -@TableName(value = "BUILDHISTORYLOG", name = "构建历史") +@TableName(value = "BUILDHISTORYLOG", name = "构建历史", parents = BuildInfoModel.class) @Data public class BuildHistoryLog extends BaseWorkspaceModel { /** @@ -109,6 +109,8 @@ public class BuildHistoryLog extends BaseWorkspaceModel { private String buildRemark; /** * 构建其他信息 + * + * @see BuildExtraModule */ private String extraData; /** diff --git a/modules/server/src/main/java/org/dromara/jpom/model/log/MonitorNotifyLog.java b/modules/server/src/main/java/org/dromara/jpom/model/log/MonitorNotifyLog.java index 173941a96..a5b6c9541 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/log/MonitorNotifyLog.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/log/MonitorNotifyLog.java @@ -36,7 +36,7 @@ import org.dromara.jpom.model.data.MonitorModel; * @since 2019/7/13 */ @EqualsAndHashCode(callSuper = true) -@TableName(value = "MONITORNOTIFYLOG", name = "监控通知") +@TableName(value = "MONITORNOTIFYLOG", name = "监控通知", parents = MonitorModel.class) @Data public class MonitorNotifyLog extends BaseWorkspaceModel { diff --git a/modules/server/src/main/java/org/dromara/jpom/model/log/OutGivingLog.java b/modules/server/src/main/java/org/dromara/jpom/model/log/OutGivingLog.java index 1f9716242..0e8169ce3 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/log/OutGivingLog.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/log/OutGivingLog.java @@ -26,6 +26,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.jpom.db.TableName; import org.dromara.jpom.model.BaseWorkspaceModel; +import org.dromara.jpom.model.outgiving.OutGivingModel; import org.dromara.jpom.model.outgiving.OutGivingNodeProject; /** @@ -35,7 +36,7 @@ import org.dromara.jpom.model.outgiving.OutGivingNodeProject; * @since 2019/7/19 **/ @EqualsAndHashCode(callSuper = true) -@TableName(value = "OUTGIVINGLOG", name = "分发日志") +@TableName(value = "OUTGIVINGLOG", name = "分发日志", parents = OutGivingModel.class, workspaceBind = 3) @Data public class OutGivingLog extends BaseWorkspaceModel { /** diff --git a/modules/server/src/main/java/org/dromara/jpom/model/log/SshTerminalExecuteLog.java b/modules/server/src/main/java/org/dromara/jpom/model/log/SshTerminalExecuteLog.java index 2d8b6b80d..a5838f8a3 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/log/SshTerminalExecuteLog.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/log/SshTerminalExecuteLog.java @@ -28,6 +28,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.dromara.jpom.db.TableName; import org.dromara.jpom.model.BaseWorkspaceModel; +import org.dromara.jpom.model.data.SshModel; /** * ssh 终端执行日志 @@ -36,7 +37,7 @@ import org.dromara.jpom.model.BaseWorkspaceModel; * @since 2021/08/04 */ @EqualsAndHashCode(callSuper = true) -@TableName(value = "SSHTERMINALEXECUTELOG", name = "ssh 终端执行日志") +@TableName(value = "SSHTERMINALEXECUTELOG", name = "ssh 终端执行日志", parents = SshModel.class) @Data @NoArgsConstructor public class SshTerminalExecuteLog extends BaseWorkspaceModel { diff --git a/modules/server/src/main/java/org/dromara/jpom/model/log/UserOperateLogV1.java b/modules/server/src/main/java/org/dromara/jpom/model/log/UserOperateLogV1.java index 71f575825..5a37c2e8b 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/log/UserOperateLogV1.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/log/UserOperateLogV1.java @@ -34,7 +34,7 @@ import org.dromara.jpom.model.BaseWorkspaceModel; * @since 2019/4/19 */ @EqualsAndHashCode(callSuper = true) -@TableName(value = "USEROPERATELOGV1", name = "用户操作日志") +@TableName(value = "USEROPERATELOGV1", name = "用户操作日志", workspaceBind = 2) @Data public class UserOperateLogV1 extends BaseWorkspaceModel { /** diff --git a/modules/server/src/main/java/org/dromara/jpom/model/node/NodeAgentWhitelist.java b/modules/server/src/main/java/org/dromara/jpom/model/node/NodeAgentWhitelist.java index cc28c28d6..677643f5b 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/node/NodeAgentWhitelist.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/node/NodeAgentWhitelist.java @@ -22,7 +22,7 @@ */ package org.dromara.jpom.model.node; -import org.dromara.jpom.model.BaseJsonModel; +import cn.keepbx.jpom.model.BaseJsonModel; /** * 服务端配置 白名单 @@ -32,58 +32,58 @@ import org.dromara.jpom.model.BaseJsonModel; */ public class NodeAgentWhitelist extends BaseJsonModel { - private String nodeIds; - private String project; - private String certificate; - private String nginx; - private String allowEditSuffix; - private String allowRemoteDownloadHost; + private String nodeIds; + private String project; + private String certificate; + private String nginx; + private String allowEditSuffix; + private String allowRemoteDownloadHost; - public String getNodeIds() { - return nodeIds; - } + public String getNodeIds() { + return nodeIds; + } - public void setNodeIds(String nodeIds) { - this.nodeIds = nodeIds; - } + public void setNodeIds(String nodeIds) { + this.nodeIds = nodeIds; + } - public String getProject() { - return project; - } + public String getProject() { + return project; + } - public void setProject(String project) { - this.project = project; - } + public void setProject(String project) { + this.project = project; + } - public String getCertificate() { - return certificate; - } + public String getCertificate() { + return certificate; + } - public void setCertificate(String certificate) { - this.certificate = certificate; - } + public void setCertificate(String certificate) { + this.certificate = certificate; + } - public String getNginx() { - return nginx; - } + public String getNginx() { + return nginx; + } - public void setNginx(String nginx) { - this.nginx = nginx; - } + public void setNginx(String nginx) { + this.nginx = nginx; + } - public String getAllowEditSuffix() { - return allowEditSuffix; - } + public String getAllowEditSuffix() { + return allowEditSuffix; + } - public void setAllowEditSuffix(String allowEditSuffix) { - this.allowEditSuffix = allowEditSuffix; - } + public void setAllowEditSuffix(String allowEditSuffix) { + this.allowEditSuffix = allowEditSuffix; + } - public String getAllowRemoteDownloadHost() { - return allowRemoteDownloadHost; - } + public String getAllowRemoteDownloadHost() { + return allowRemoteDownloadHost; + } - public void setAllowRemoteDownloadHost(String allowRemoteDownloadHost) { - this.allowRemoteDownloadHost = allowRemoteDownloadHost; - } + public void setAllowRemoteDownloadHost(String allowRemoteDownloadHost) { + this.allowRemoteDownloadHost = allowRemoteDownloadHost; + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/model/node/NodeScriptExecuteLogCacheModel.java b/modules/server/src/main/java/org/dromara/jpom/model/node/NodeScriptExecuteLogCacheModel.java index 1af7ba260..c1872fd6a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/node/NodeScriptExecuteLogCacheModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/node/NodeScriptExecuteLogCacheModel.java @@ -33,7 +33,7 @@ import org.dromara.jpom.model.BaseNodeModel; * @since 2021/12/12 */ @EqualsAndHashCode(callSuper = true) -@TableName(value = "SCRIPT_EXECUTE_LOG", name = "节点脚本模版执行记录") +@TableName(value = "SCRIPT_EXECUTE_LOG", name = "节点脚本模版执行记录", parents = NodeScriptCacheModel.class) @Data public class NodeScriptExecuteLogCacheModel extends BaseNodeModel { diff --git a/modules/server/src/main/java/org/dromara/jpom/model/outgiving/BaseNodeProject.java b/modules/server/src/main/java/org/dromara/jpom/model/outgiving/BaseNodeProject.java index b049e3b79..a7077fcd8 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/outgiving/BaseNodeProject.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/outgiving/BaseNodeProject.java @@ -22,9 +22,9 @@ */ package org.dromara.jpom.model.outgiving; +import cn.keepbx.jpom.model.BaseJsonModel; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.jpom.model.BaseJsonModel; /** * @author bwcx_jzy diff --git a/modules/server/src/main/java/org/dromara/jpom/model/script/ScriptExecuteLogModel.java b/modules/server/src/main/java/org/dromara/jpom/model/script/ScriptExecuteLogModel.java index 3e623aed7..a249fc982 100644 --- a/modules/server/src/main/java/org/dromara/jpom/model/script/ScriptExecuteLogModel.java +++ b/modules/server/src/main/java/org/dromara/jpom/model/script/ScriptExecuteLogModel.java @@ -29,7 +29,7 @@ import org.dromara.jpom.model.BaseWorkspaceModel; * @author bwcx_jzy * @since 2022/1/19 */ -@TableName(value = "SERVER_SCRIPT_EXECUTE_LOG", name = "脚本模版执行记录") +@TableName(value = "SERVER_SCRIPT_EXECUTE_LOG", name = "脚本模版执行记录", parents = ScriptModel.class) public class ScriptExecuteLogModel extends BaseWorkspaceModel { /** diff --git a/modules/server/src/main/java/org/dromara/jpom/monitor/MonitorItem.java b/modules/server/src/main/java/org/dromara/jpom/monitor/MonitorItem.java index 44187d5f3..4d27abbb7 100644 --- a/modules/server/src/main/java/org/dromara/jpom/monitor/MonitorItem.java +++ b/modules/server/src/main/java/org/dromara/jpom/monitor/MonitorItem.java @@ -31,11 +31,11 @@ import cn.hutool.cron.task.Task; import cn.hutool.db.sql.Direction; import cn.hutool.db.sql.Order; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.model.data.MonitorModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingItemRun.java b/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingItemRun.java index ca45e03ce..07ce0f11d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingItemRun.java +++ b/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingItemRun.java @@ -28,10 +28,10 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.AfterOpt; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.log.OutGivingLog; diff --git a/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingRun.java b/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingRun.java index 63a567ccd..54dfd573a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingRun.java +++ b/modules/server/src/main/java/org/dromara/jpom/outgiving/OutGivingRun.java @@ -32,17 +32,17 @@ import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.BaseIdModel; +import cn.keepbx.jpom.model.JsonMessage; import cn.keepbx.jpom.plugins.IPlugin; import com.alibaba.fastjson2.JSONObject; import lombok.Builder; import lombok.Lombok; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.model.AfterOpt; -import org.dromara.jpom.model.BaseIdModel; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.log.OutGivingLog; import org.dromara.jpom.model.outgiving.OutGivingModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/permission/ClassFeature.java b/modules/server/src/main/java/org/dromara/jpom/permission/ClassFeature.java index 610ed708f..00096deb7 100644 --- a/modules/server/src/main/java/org/dromara/jpom/permission/ClassFeature.java +++ b/modules/server/src/main/java/org/dromara/jpom/permission/ClassFeature.java @@ -29,6 +29,7 @@ import org.dromara.jpom.func.assets.server.MachineSshServer; import org.dromara.jpom.func.cert.service.CertificateInfoService; import org.dromara.jpom.func.files.service.FileReleaseTaskService; import org.dromara.jpom.func.files.service.FileStorageService; +import org.dromara.jpom.func.system.service.ClusterInfoService; import org.dromara.jpom.func.user.server.UserLoginLogServer; import org.dromara.jpom.service.dblog.*; import org.dromara.jpom.service.docker.DockerInfoService; @@ -113,6 +114,7 @@ public enum ClassFeature { SYSTEM_BACKUP("数据库备份", BackupInfoService.class), SYSTEM_WORKSPACE("工作空间", WorkspaceService.class), SYSTEM_WORKSPACE_ENV("环境变量", WorkspaceEnvVarService.class), + CLUSTER_INFO("集群管理", ClusterInfoService.class), SCRIPT("脚本模板", ScriptServer.class), SCRIPT_LOG("脚本模板日志", ScriptExecuteLogServer.class), diff --git a/modules/server/src/main/java/org/dromara/jpom/service/dblog/BuildInfoService.java b/modules/server/src/main/java/org/dromara/jpom/service/dblog/BuildInfoService.java index 80e87c942..bf4e0807a 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/dblog/BuildInfoService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/dblog/BuildInfoService.java @@ -26,18 +26,18 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.cron.task.Task; import cn.hutool.db.Entity; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.cron.ICron; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.build.BuildExecuteService; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.ICron; import org.dromara.jpom.model.data.BuildInfoModel; import org.dromara.jpom.model.enums.BuildReleaseMethod; import org.dromara.jpom.model.enums.BuildStatus; import org.dromara.jpom.model.user.UserModel; import org.dromara.jpom.service.IStatusRecover; import org.dromara.jpom.service.ITriggerToken; -import org.dromara.jpom.service.h2db.BaseGroupService; +import org.dromara.jpom.service.h2db.BaseWorkspaceService; import org.dromara.jpom.util.StringUtil; import org.springframework.stereotype.Service; @@ -52,7 +52,7 @@ import java.util.List; **/ @Service @Slf4j -public class BuildInfoService extends BaseGroupService implements ICron, IStatusRecover, ITriggerToken { +public class BuildInfoService extends BaseWorkspaceService implements ICron, IStatusRecover, ITriggerToken { /** * 更新状态 @@ -90,9 +90,10 @@ public class BuildInfoService extends BaseGroupService implement } @Override - public void insert(BuildInfoModel buildInfoModel) { - super.insert(buildInfoModel); + public int insert(BuildInfoModel buildInfoModel) { + int count = super.insert(buildInfoModel); this.checkCron(buildInfoModel); + return count; } @Override @@ -155,6 +156,13 @@ public class BuildInfoService extends BaseGroupService implement return getTableName(); } + + public List hasResultKeep() { + // + String sql = "select * from " + super.getTableName() + " where resultKeepDay>0"; + return super.queryList(sql); + } + private static class CronTask implements Task { private final String buildId; diff --git a/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbBuildHistoryLogService.java b/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbBuildHistoryLogService.java index 5e322d3b9..f746d133c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbBuildHistoryLogService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbBuildHistoryLogService.java @@ -23,11 +23,23 @@ package org.dromara.jpom.service.dblog; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.db.Entity; +import cn.hutool.db.Page; +import cn.hutool.db.sql.Direction; +import cn.hutool.db.sql.Order; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.event.ISystemTask; +import cn.keepbx.jpom.model.JsonMessage; import lombok.extern.slf4j.Slf4j; +import org.dromara.jpom.build.BuildExtraModule; import org.dromara.jpom.build.BuildUtil; -import org.dromara.jpom.common.JsonMessage; +import org.dromara.jpom.model.BaseDbModel; +import org.dromara.jpom.model.PageResultDto; import org.dromara.jpom.model.data.BuildInfoModel; import org.dromara.jpom.model.enums.BuildStatus; import org.dromara.jpom.model.log.BuildHistoryLog; @@ -36,7 +48,10 @@ import org.dromara.jpom.system.extconf.BuildExtConfig; import org.springframework.stereotype.Service; import java.io.File; +import java.util.List; import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * 构建历史db @@ -46,7 +61,7 @@ import java.util.Optional; */ @Service @Slf4j -public class DbBuildHistoryLogService extends BaseWorkspaceService { +public class DbBuildHistoryLogService extends BaseWorkspaceService implements ISystemTask { private final BuildInfoService buildService; private final BuildExtConfig buildExtConfig; @@ -81,7 +96,7 @@ public class DbBuildHistoryLogService extends BaseWorkspaceService deleteLogAndFile(BuildHistoryLog buildHistoryLog) { + public IJsonMessage deleteLogAndFile(BuildHistoryLog buildHistoryLog) { if (buildHistoryLog == null) { return JsonMessage.success("没有对应构建记录,忽略删除"); } @@ -99,7 +114,7 @@ public class DbBuildHistoryLogService extends BaseWorkspaceService(200, "删除成功", count + ""); + return new JsonMessage<>(200, "删除成功", String.valueOf(count)); } @Override @@ -113,28 +128,46 @@ public class DbBuildHistoryLogService extends BaseWorkspaceService { - entity.set("buildDataId", buildHistoryLog.getBuildDataId()); - // 清理单项构建历史保留个数只判断(构建结束、发布中、发布失败、发布失败)有效构建状态,避免无法保留有效构建历史 - entity.set("status", CollUtil.newArrayList( - BuildStatus.Success.getCode(), - BuildStatus.PubIng.getCode(), - BuildStatus.PubSuccess.getCode(), - BuildStatus.PubError.getCode())); - }, - buildHistoryLog1 -> { - JsonMessage jsonMessage = this.deleteLogAndFile(buildHistoryLog1); - if (!jsonMessage.success()) { - log.warn("{} {} {}", buildHistoryLog1.getBuildName(), buildHistoryLog1.getBuildNumberId(), jsonMessage); - return false; - } - return true; - }); + if (resultKeepCount > 0 || buildItemMaxHistoryCount > 0) { + // 至少有一个配置 + int useCount; + if (resultKeepCount > 0 && buildItemMaxHistoryCount > 0) { + // 都配置过,使用最小值 + useCount = Math.min(resultKeepCount, buildItemMaxHistoryCount); + } else { + // 只配置了一处,使用最大值 + useCount = Math.max(resultKeepCount, buildItemMaxHistoryCount); + } + super.autoLoopClear("startTime", useCount, entity -> this.fillClearWhere(entity, buildHistoryLog.getBuildDataId()), this.predicate()); + } + return count; + } + + private Predicate predicate() { + return buildHistoryLog1 -> { + IJsonMessage jsonMessage = this.deleteLogAndFile(buildHistoryLog1); + if (!jsonMessage.success()) { + log.warn("{} {} {}", buildHistoryLog1.getBuildName(), buildHistoryLog1.getBuildNumberId(), jsonMessage); + return false; + } + return true; + }; + } + + private void fillClearWhere(Entity entity, String buildDataId) { + entity.set("buildDataId", buildDataId); + // 清理单项构建历史保留个数只判断(构建结束、发布中、发布失败、发布失败)有效构建状态,避免无法保留有效构建历史 + entity.set("status", CollUtil.newArrayList( + BuildStatus.Success.getCode(), + BuildStatus.PubIng.getCode(), + BuildStatus.PubSuccess.getCode(), + BuildStatus.PubError.getCode())); } @Override @@ -147,19 +180,55 @@ public class DbBuildHistoryLogService extends BaseWorkspaceService { - JsonMessage jsonMessage = this.deleteLogAndFile(buildHistoryLog1); - if (!jsonMessage.success()) { - log.warn("{} {} {}", buildHistoryLog1.getBuildName(), buildHistoryLog1.getBuildNumberId(), jsonMessage); - return false; - } - return true; - }); + null, + buildHistoryLog1 -> { + IJsonMessage jsonMessage = this.deleteLogAndFile(buildHistoryLog1); + if (!jsonMessage.success()) { + log.warn("{} {} {}", buildHistoryLog1.getBuildName(), buildHistoryLog1.getBuildNumberId(), jsonMessage); + return false; + } + return true; + }); } @Override protected String[] clearTimeColumns() { return super.clearTimeColumns(); } + + @Override + public void executeTask() { + List buildInfoModels = buildService.hasResultKeep(); + if (CollUtil.isEmpty(buildInfoModels)) { + return; + } + for (BuildInfoModel buildInfoModel : buildInfoModels) { + Integer resultKeepDay = buildInfoModel.getResultKeepDay(); + if (resultKeepDay == null || resultKeepDay <= 0) { + continue; + } + log.debug("自动删除过期的构建历史相关文件:{} {}", buildInfoModel.getName(), resultKeepDay); + Entity entity = Entity.create(); + this.fillClearWhere(entity, buildInfoModel.getId()); + DateTime date = DateTime.now(); + date = DateUtil.offsetDay(date, -resultKeepDay); + date = DateUtil.beginOfDay(date); + entity.set("startTime", "< " + date.getTime()); + while (true) { + Page page = new Page(1, 50); + page.addOrder(new Order("startTime", Direction.DESC)); + PageResultDto pageResult = this.listPage(entity, page); + if (pageResult.isEmpty()) { + break; + } + List ids = pageResult.getResult() + .stream() + .filter(this.predicate()) + .map(BaseDbModel::getId) + .collect(Collectors.toList()); + // + this.delByKey(ids, null); + } + } + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbMonitorNotifyLogService.java b/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbMonitorNotifyLogService.java index 73ce5a838..da0099588 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbMonitorNotifyLogService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/dblog/DbMonitorNotifyLogService.java @@ -39,11 +39,11 @@ public class DbMonitorNotifyLogService extends BaseWorkspaceService extends BaseDbCommonS @Autowired @Lazy private DbExtConfig extConfig; - + /** + * 旧版本分组 + */ + private final boolean canGroup; + /** + * 新版本分组字段 + */ + private final boolean canGroupName; /** * 默认排序规则 */ @@ -78,10 +84,76 @@ public abstract class BaseDbService extends BaseDbCommonS new Order("modifyTimeMillis", Direction.DESC) }; - public void insert(T t) { + public BaseDbService() { + super(); + this.canGroup = ReflectUtil.hasField(this.tClass, "group"); + this.canGroupName = ReflectUtil.hasField(this.tClass, "groupName"); + } + + public boolean isCanGroup() { + return canGroup; + } + + /** + * load date group by group name + * + * @return list + */ + public List listGroup() { + String sql = "select `GROUP` from " + getTableName() + " group by `GROUP`"; + return this.listGroupByName(sql, "group"); + } + + + /** + * load date group by group name + * + * @return list + */ + public List listGroupName() { + String sql = "select `groupName` from " + this.getTableName() + " group by `groupName`"; + return this.listGroupByName(sql, "groupName"); + } + + /** + * 获取分组字段 + * + * @param sql sql 预计 + * @param params 参数 + * @return list + */ + public List listGroupByName(String sql, String fieldName, Object... params) { + Assert.state(this.canGroup || this.canGroupName, "当前数据表不支持分组"); + List list = super.query(sql, params); + // 筛选字段 + return list.stream() + .flatMap(entity -> { + Object obj = entity.get(fieldName); + if (obj == null) { + return null; + } + return Stream.of(String.valueOf(obj)); + }) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + + /** + * 恢复字段 + */ + public void repairGroupFiled() { + Assert.state(this.canGroup, "当前数据表不支持分组"); + String sql = "update " + getTableName() + " set `GROUP`=? where `GROUP` is null or `GROUP`=''"; + super.execute(sql, Const.DEFAULT_GROUP_NAME); + } + + public int insert(T t) { this.fillInsert(t); - super.insertDb(t); + int count = super.insertDb(t); this.executeClear(); + return count; } /** @@ -285,6 +357,18 @@ public abstract class BaseDbService extends BaseDbCommonS return this.entityToBeanList(entity); } + /** + * 查询 list + * + * @param where 条件 + * @param fill 是否填充 + * @return data + */ + public List listByEntity(Entity where, boolean fill) { + List entity = this.queryList(where); + return this.entityToBeanList(entity, fill); + } + /** * 查询列表 * diff --git a/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseGroupService.java b/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseGroupService.java index f4dc9380f..04d8da6d4 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseGroupService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseGroupService.java @@ -20,53 +20,75 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package org.dromara.jpom.service.h2db; - -import cn.hutool.db.Entity; -import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.ServerConst; -import org.dromara.jpom.model.BaseGroupModel; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * 分组 server - * - * @author bwcx_jzy - * @since 2022/1/5 - */ -public abstract class BaseGroupService extends BaseWorkspaceService { - - - /** - * load date group by group name - * - * @return list - */ - public List listGroup(HttpServletRequest request) { - String workspaceId = getCheckUserWorkspace(request); - String sql = "select `GROUP` from " + getTableName() + " where workspaceId=? group by `GROUP`"; - List list = super.query(sql, workspaceId); - // 筛选字段 - return list.stream().flatMap(entity -> { - Object obj = entity.get(ServerConst.GROUP_STR); - if (obj == null) { - return null; - } - return Stream.of(String.valueOf(obj)); - }).filter(Objects::nonNull) - .distinct().collect(Collectors.toList()); - } - - /** - * 恢复字段 - */ - public void repairGroupFiled() { - String sql = "update " + getTableName() + " set `GROUP`=? where `GROUP` is null or `GROUP`=''"; - super.execute(sql, Const.DEFAULT_GROUP_NAME); - } -} +///* +// * The MIT License (MIT) +// * +// * Copyright (c) 2019 Code Technology Studio +// * +// * Permission is hereby granted, free of charge, to any person obtaining a copy of +// * this software and associated documentation files (the "Software"), to deal in +// * the Software without restriction, including without limitation the rights to +// * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// * the Software, and to permit persons to whom the Software is furnished to do so, +// * subject to the following conditions: +// * +// * The above copyright notice and this permission notice shall be included in all +// * copies or substantial portions of the Software. +// * +// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// */ +//package org.dromara.jpom.service.h2db; +// +//import cn.hutool.db.Entity; +//import org.dromara.jpom.common.Const; +//import org.dromara.jpom.common.ServerConst; +//import org.dromara.jpom.model.BaseGroupModel; +// +//import javax.servlet.http.HttpServletRequest; +//import java.util.List; +//import java.util.Objects; +//import java.util.stream.Collectors; +//import java.util.stream.Stream; +// +///** +// * 分组 server +// * +// * @author bwcx_jzy +// * @since 2022/1/5 +// */ +//public abstract class BaseGroupService extends BaseWorkspaceService { +// +// +// /** +// * load date group by group name +// * +// * @return list +// */ +// public List listGroup(HttpServletRequest request) { +// String workspaceId = getCheckUserWorkspace(request); +// String sql = "select `GROUP` from " + getTableName() + " where workspaceId=? group by `GROUP`"; +// List list = super.query(sql, workspaceId); +// // 筛选字段 +// return list.stream().flatMap(entity -> { +// Object obj = entity.get(ServerConst.GROUP_STR); +// if (obj == null) { +// return null; +// } +// return Stream.of(String.valueOf(obj)); +// }).filter(Objects::nonNull) +// .distinct().collect(Collectors.toList()); +// } +// +// /** +// * 恢复字段 +// */ +// public void repairGroupFiled() { +// String sql = "update " + getTableName() + " set `GROUP`=? where `GROUP` is null or `GROUP`=''"; +// super.execute(sql, Const.DEFAULT_GROUP_NAME); +// } +//} diff --git a/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseNodeGroupService.java b/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseNodeGroupService.java index 8541602b0..79192bc16 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseNodeGroupService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseNodeGroupService.java @@ -20,58 +20,80 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package org.dromara.jpom.service.h2db; - -import cn.hutool.db.Entity; -import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.ServerConst; -import org.dromara.jpom.model.BaseNodeGroupModel; -import org.dromara.jpom.service.node.NodeService; -import org.dromara.jpom.service.system.WorkspaceService; - -import javax.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @author bwcx_jzy - * @since 2023/2/8 - */ -public abstract class BaseNodeGroupService extends BaseNodeService { - - protected BaseNodeGroupService(NodeService nodeService, - WorkspaceService workspaceService, - String dataName) { - super(nodeService, workspaceService, dataName); - } - - /** - * load date group by group name - * - * @return list - */ - public List listGroup(HttpServletRequest request) { - String workspaceId = getCheckUserWorkspace(request); - String sql = "select `GROUP` from " + getTableName() + " where workspaceId=? group by `GROUP`"; - List list = super.query(sql, workspaceId); - // 筛选字段 - return list.stream().flatMap(entity -> { - Object obj = entity.get(ServerConst.GROUP_STR); - if (obj == null) { - return null; - } - return Stream.of(String.valueOf(obj)); - }).filter(Objects::nonNull) - .distinct().collect(Collectors.toList()); - } - - /** - * 恢复字段 - */ - public void repairGroupFiled() { - String sql = "update " + getTableName() + " set `GROUP`=? where `GROUP` is null or `GROUP`=''"; - super.execute(sql, Const.DEFAULT_GROUP_NAME); - } -} +///* +// * The MIT License (MIT) +// * +// * Copyright (c) 2019 Code Technology Studio +// * +// * Permission is hereby granted, free of charge, to any person obtaining a copy of +// * this software and associated documentation files (the "Software"), to deal in +// * the Software without restriction, including without limitation the rights to +// * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// * the Software, and to permit persons to whom the Software is furnished to do so, +// * subject to the following conditions: +// * +// * The above copyright notice and this permission notice shall be included in all +// * copies or substantial portions of the Software. +// * +// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// */ +//package org.dromara.jpom.service.h2db; +// +//import cn.hutool.db.Entity; +//import org.dromara.jpom.common.Const; +//import org.dromara.jpom.common.ServerConst; +//import org.dromara.jpom.model.BaseNodeGroupModel; +//import org.dromara.jpom.service.node.NodeService; +//import org.dromara.jpom.service.system.WorkspaceService; +// +//import javax.servlet.http.HttpServletRequest; +//import java.util.List; +//import java.util.Objects; +//import java.util.stream.Collectors; +//import java.util.stream.Stream; +// +///** +// * @author bwcx_jzy +// * @since 2023/2/8 +// */ +//public abstract class BaseNodeGroupService extends BaseNodeService { +// +// protected BaseNodeGroupService(NodeService nodeService, +// WorkspaceService workspaceService, +// String dataName) { +// super(nodeService, workspaceService, dataName); +// } +// +// /** +// * load date group by group name +// * +// * @return list +// */ +// public List listGroup(HttpServletRequest request) { +// String workspaceId = getCheckUserWorkspace(request); +// String sql = "select `GROUP` from " + getTableName() + " where workspaceId=? group by `GROUP`"; +// List list = super.query(sql, workspaceId); +// // 筛选字段 +// return list.stream().flatMap(entity -> { +// Object obj = entity.get(ServerConst.GROUP_STR); +// if (obj == null) { +// return null; +// } +// return Stream.of(String.valueOf(obj)); +// }).filter(Objects::nonNull) +// .distinct().collect(Collectors.toList()); +// } +// +// /** +// * 恢复字段 +// */ +// public void repairGroupFiled() { +// String sql = "update " + getTableName() + " set `GROUP`=? where `GROUP` is null or `GROUP`=''"; +// super.execute(sql, Const.DEFAULT_GROUP_NAME); +// } +//} diff --git a/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseWorkspaceService.java b/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseWorkspaceService.java index 68430f1f5..2b0a9b3c0 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseWorkspaceService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/h2db/BaseWorkspaceService.java @@ -345,4 +345,15 @@ public abstract class BaseWorkspaceService extends String updateSql = "update " + this.tableName + " set sortValue=? where id=? and workspaceId=?"; this.execute(updateSql, up ? compareSortValue + 0.0001f : compareSortValue - 0.0001f, id, workspaceId); } + + /** + * load date group by group name + * + * @return list + */ + public List listGroup(HttpServletRequest request) { + String workspaceId = getCheckUserWorkspace(request); + String sql = "select `GROUP` from " + getTableName() + " where workspaceId=? group by `GROUP`"; + return super.listGroupByName(sql, "GROUP", workspaceId); + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/service/monitor/MonitorService.java b/modules/server/src/main/java/org/dromara/jpom/service/monitor/MonitorService.java index 371175a55..0283fe740 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/monitor/MonitorService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/monitor/MonitorService.java @@ -22,9 +22,9 @@ */ package org.dromara.jpom.service.monitor; +import cn.keepbx.jpom.cron.ICron; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.ICron; import org.dromara.jpom.model.data.MonitorModel; import org.dromara.jpom.monitor.MonitorItem; import org.dromara.jpom.service.h2db.BaseWorkspaceService; @@ -44,9 +44,10 @@ import java.util.List; public class MonitorService extends BaseWorkspaceService implements ICron { @Override - public void insert(MonitorModel monitorModel) { - super.insert(monitorModel); + public int insert(MonitorModel monitorModel) { + int count = super.insert(monitorModel); this.checkCron(monitorModel); + return count; } @Override @@ -134,24 +135,24 @@ public class MonitorService extends BaseWorkspaceService implement } - /*public boolean checkProject(String nodeId, String projectId) { - List list = list(); - if (list == null || list.isEmpty()) { - return false; - } - for (MonitorModel monitorModel : list) { - List projects = monitorModel.projects(); - if (projects != null) { - for (MonitorModel.NodeProject project : projects) { - if (project.getNode().equals(nodeId)) { - List projects1 = project.getProjects(); - if (projects1 != null && projects1.contains(projectId)) { - return true; - } - } - } - } - } - return false; - }*/ + /*public boolean checkProject(String nodeId, String projectId) { + List list = list(); + if (list == null || list.isEmpty()) { + return false; + } + for (MonitorModel monitorModel : list) { + List projects = monitorModel.projects(); + if (projects != null) { + for (MonitorModel.NodeProject project : projects) { + if (project.getNode().equals(nodeId)) { + List projects1 = project.getProjects(); + if (projects1 != null && projects1.contains(projectId)) { + return true; + } + } + } + } + } + return false; + }*/ } diff --git a/modules/server/src/main/java/org/dromara/jpom/service/node/NodeService.java b/modules/server/src/main/java/org/dromara/jpom/service/node/NodeService.java index 6c3363417..243459ba7 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/node/NodeService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/node/NodeService.java @@ -31,7 +31,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.data.SshModel; -import org.dromara.jpom.service.h2db.BaseGroupService; +import org.dromara.jpom.service.h2db.BaseWorkspaceService; import org.dromara.jpom.service.node.ssh.SshService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -47,7 +47,7 @@ import java.util.List; */ @Service @Slf4j -public class NodeService extends BaseGroupService { +public class NodeService extends BaseWorkspaceService { private final SshService sshService; diff --git a/modules/server/src/main/java/org/dromara/jpom/service/node/ProjectInfoCacheService.java b/modules/server/src/main/java/org/dromara/jpom/service/node/ProjectInfoCacheService.java index d0c1d4be9..c283455bc 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/node/ProjectInfoCacheService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/node/ProjectInfoCacheService.java @@ -22,15 +22,15 @@ */ package org.dromara.jpom.service.node; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.node.ProjectInfoCacheModel; import org.dromara.jpom.service.ITriggerToken; -import org.dromara.jpom.service.h2db.BaseNodeGroupService; +import org.dromara.jpom.service.h2db.BaseNodeService; import org.dromara.jpom.service.system.WorkspaceService; import org.springframework.stereotype.Service; @@ -39,8 +39,7 @@ import org.springframework.stereotype.Service; * @since 2021/12/5 */ @Service -public class ProjectInfoCacheService extends BaseNodeGroupService implements ITriggerToken { - +public class ProjectInfoCacheService extends BaseNodeService implements ITriggerToken { public ProjectInfoCacheService(NodeService nodeService, WorkspaceService workspaceService) { diff --git a/modules/server/src/main/java/org/dromara/jpom/service/node/script/NodeScriptExecuteLogServer.java b/modules/server/src/main/java/org/dromara/jpom/service/node/script/NodeScriptExecuteLogServer.java index a14a0942f..ae138efd5 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/node/script/NodeScriptExecuteLogServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/node/script/NodeScriptExecuteLogServer.java @@ -24,12 +24,12 @@ package org.dromara.jpom.service.node.script; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; diff --git a/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/CommandService.java b/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/CommandService.java index eb13ca0a1..1c676c33e 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/CommandService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/CommandService.java @@ -30,11 +30,11 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.cron.task.Task; import cn.hutool.extra.ssh.JschUtil; import cn.hutool.system.SystemUtil; +import cn.keepbx.jpom.cron.ICron; import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.ICron; import org.dromara.jpom.func.assets.model.MachineSshModel; import org.dromara.jpom.model.EnvironmentMapBuilder; import org.dromara.jpom.model.data.CommandExecLogModel; @@ -46,7 +46,10 @@ import org.dromara.jpom.script.CommandParam; import org.dromara.jpom.service.ITriggerToken; import org.dromara.jpom.service.h2db.BaseWorkspaceService; import org.dromara.jpom.service.system.WorkspaceEnvVarService; -import org.dromara.jpom.util.*; +import org.dromara.jpom.util.LogRecorder; +import org.dromara.jpom.util.StrictSyncFinisher; +import org.dromara.jpom.util.StringUtil; +import org.dromara.jpom.util.SyncFinisherUtil; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -82,9 +85,10 @@ public class CommandService extends BaseWorkspaceService implement } @Override - public void insert(CommandModel commandModel) { - super.insert(commandModel); + public int insert(CommandModel commandModel) { + int count = super.insert(commandModel); this.checkCron(commandModel); + return count; } @Override @@ -311,34 +315,34 @@ public class CommandService extends BaseWorkspaceService implement */ public void syncToWorkspace(String ids, String nowWorkspaceId, String workspaceId) { StrUtil.splitTrim(ids, StrUtil.COMMA) - .forEach(id -> { - CommandModel data = super.getByKey(id, false, entity -> entity.set("workspaceId", nowWorkspaceId)); - Assert.notNull(data, "没有对应的ssh脚本信息"); - // - CommandModel where = new CommandModel(); - where.setWorkspaceId(workspaceId); - where.setName(data.getName()); - CommandModel exits = super.queryByBean(where); - if (exits == null) { - // 不存在则添加 信息 - data.setId(null); - data.setWorkspaceId(workspaceId); - data.setCreateTimeMillis(null); - data.setModifyTimeMillis(null); - data.setSshIds(null); - data.setModifyUser(null); - super.insert(data); - } else { - // 修改信息 - CommandModel update = new CommandModel(); - update.setId(exits.getId()); - update.setCommand(data.getCommand()); - update.setDesc(data.getDesc()); - update.setDefParams(data.getDefParams()); - update.setAutoExecCron(data.getAutoExecCron()); - super.updateById(update); - } - }); + .forEach(id -> { + CommandModel data = super.getByKey(id, false, entity -> entity.set("workspaceId", nowWorkspaceId)); + Assert.notNull(data, "没有对应的ssh脚本信息"); + // + CommandModel where = new CommandModel(); + where.setWorkspaceId(workspaceId); + where.setName(data.getName()); + CommandModel exits = super.queryByBean(where); + if (exits == null) { + // 不存在则添加 信息 + data.setId(null); + data.setWorkspaceId(workspaceId); + data.setCreateTimeMillis(null); + data.setModifyTimeMillis(null); + data.setSshIds(null); + data.setModifyUser(null); + super.insert(data); + } else { + // 修改信息 + CommandModel update = new CommandModel(); + update.setId(exits.getId()); + update.setCommand(data.getCommand()); + update.setDesc(data.getDesc()); + update.setDefParams(data.getDefParams()); + update.setAutoExecCron(data.getAutoExecCron()); + super.updateById(update); + } + }); } } diff --git a/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/SshService.java b/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/SshService.java index 8b0d8142a..4eb8dfa86 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/SshService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/node/ssh/SshService.java @@ -29,13 +29,17 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.ssh.ChannelType; import cn.hutool.extra.ssh.JschUtil; import cn.hutool.extra.ssh.Sftp; -import com.jcraft.jsch.*; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.func.assets.model.MachineSshModel; import org.dromara.jpom.func.assets.server.MachineSshServer; import org.dromara.jpom.model.data.SshModel; -import org.dromara.jpom.service.h2db.BaseGroupService; +import org.dromara.jpom.plugins.JschLogger; +import org.dromara.jpom.service.h2db.BaseWorkspaceService; import org.dromara.jpom.system.extconf.BuildExtConfig; import org.dromara.jpom.util.LogRecorder; import org.dromara.jpom.util.MySftp; @@ -57,7 +61,7 @@ import java.util.concurrent.ConcurrentHashMap; */ @Service @Slf4j -public class SshService extends BaseGroupService implements Logger { +public class SshService extends BaseWorkspaceService { @Resource @Lazy @@ -66,7 +70,7 @@ public class SshService extends BaseGroupService implements Logger { public SshService(BuildExtConfig buildExtConfig) { this.buildExtConfig = buildExtConfig; - JSch.setLogger(this); + JSch.setLogger(JschLogger.LOGGER); } @Override @@ -183,74 +187,31 @@ public class SshService extends BaseGroupService implements Logger { */ public void syncToWorkspace(String ids, String nowWorkspaceId, String workspaceId) { StrUtil.splitTrim(ids, StrUtil.COMMA) - .forEach(id -> { - SshModel data = super.getByKey(id, false, entity -> entity.set("workspaceId", nowWorkspaceId)); - Assert.notNull(data, "没有对应的ssh信息"); - // - SshModel where = new SshModel(); - where.setWorkspaceId(workspaceId); - where.setMachineSsh(data.getMachineSsh()); - SshModel sshModel = super.queryByBean(where); - Assert.isNull(sshModel, "对应的工作空间已经存在当前 SSH 啦"); - // 不存在则添加 信息 - data.setId(null); - data.setWorkspaceId(workspaceId); - data.setCreateTimeMillis(null); - data.setModifyTimeMillis(null); - data.setModifyUser(null); - data.setHost(null); - data.setUser(null); - data.setPassword(null); - data.setPort(null); - data.setConnectType(null); - data.setCharset(null); - data.setPrivateKey(null); - data.setTimeout(null); - super.insert(data); - }); - } - - @Override - public boolean isEnabled(int level) { - switch (level) { - case DEBUG: - return log.isDebugEnabled(); - case INFO: - return log.isInfoEnabled(); - case WARN: - return log.isWarnEnabled(); - case ERROR: - case FATAL: - return log.isErrorEnabled(); - default: - log.warn("未知的 jsch 日志级别:{}", level); - return false; - } - } - - @Override - public void log(int level, String message) { - switch (level) { - case DEBUG: - // info 日志太多 记录维 debug - case INFO: - log.debug(message); - break; - case WARN: - if (StrUtil.isWrap(message, "Permanently added", "to the list of known hosts.")) { - // 避免过多日志 - log.debug(message); - } else { - log.warn(message); - } - break; - case ERROR: - case FATAL: - log.error(message); - break; - default: - log.warn("未知的 jsch 日志级别:{} {}", level, message); - } + .forEach(id -> { + SshModel data = super.getByKey(id, false, entity -> entity.set("workspaceId", nowWorkspaceId)); + Assert.notNull(data, "没有对应的ssh信息"); + // + SshModel where = new SshModel(); + where.setWorkspaceId(workspaceId); + where.setMachineSsh(data.getMachineSsh()); + SshModel sshModel = super.queryByBean(where); + Assert.isNull(sshModel, "对应的工作空间已经存在当前 SSH 啦"); + // 不存在则添加 信息 + data.setId(null); + data.setWorkspaceId(workspaceId); + data.setCreateTimeMillis(null); + data.setModifyTimeMillis(null); + data.setModifyUser(null); + data.setHost(null); + data.setUser(null); + data.setPassword(null); + data.setPort(null); + data.setConnectType(null); + data.setCharset(null); + data.setPrivateKey(null); + data.setTimeout(null); + super.insert(data); + }); } public long countByMachine(String machineSshId) { @@ -306,11 +267,17 @@ public class SshService extends BaseGroupService implements Logger { if (progressRangeList.add(progressRange)) { // total, progressSize logRecorder.system("上传文件进度:{} {}/{} {} ", desc, - FileUtil.readableFileSize(now), FileUtil.readableFileSize(max), - NumberUtil.formatPercent(((float) now / max), 0) + FileUtil.readableFileSize(now), FileUtil.readableFileSize(max), + NumberUtil.formatPercent(((float) now / max), 0) ); } } }; } + + public SshModel getByMachineSshId(String id) { + SshModel model = new SshModel(); + model.setMachineSshId(id); + return queryByBean(model); + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/service/outgiving/OutGivingServer.java b/modules/server/src/main/java/org/dromara/jpom/service/outgiving/OutGivingServer.java index d82bd2a37..a24cb5f26 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/outgiving/OutGivingServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/outgiving/OutGivingServer.java @@ -25,7 +25,7 @@ package org.dromara.jpom.service.outgiving; import org.dromara.jpom.model.outgiving.OutGivingModel; import org.dromara.jpom.model.outgiving.OutGivingNodeProject; import org.dromara.jpom.service.IStatusRecover; -import org.dromara.jpom.service.h2db.BaseGroupService; +import org.dromara.jpom.service.h2db.BaseWorkspaceService; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -39,7 +39,7 @@ import java.util.List; * @since 2019/4/21 */ @Service -public class OutGivingServer extends BaseGroupService implements IStatusRecover { +public class OutGivingServer extends BaseWorkspaceService implements IStatusRecover { public void checkNodeProject(String nodeId, String projectId, HttpServletRequest request) { diff --git a/modules/server/src/main/java/org/dromara/jpom/service/script/ScriptServer.java b/modules/server/src/main/java/org/dromara/jpom/service/script/ScriptServer.java index 55880339a..d785c4b7d 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/script/ScriptServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/script/ScriptServer.java @@ -25,10 +25,10 @@ package org.dromara.jpom.service.script; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.task.Task; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.cron.ICron; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.cron.CronUtils; -import org.dromara.jpom.cron.ICron; import org.dromara.jpom.model.script.ScriptExecuteLogModel; import org.dromara.jpom.model.script.ScriptModel; import org.dromara.jpom.model.user.UserModel; @@ -57,9 +57,10 @@ public class ScriptServer extends BaseGlobalOrWorkspaceService impl } @Override - public void insert(ScriptModel scriptModel) { - super.insert(scriptModel); + public int insert(ScriptModel scriptModel) { + int count = super.insert(scriptModel); this.checkCron(scriptModel); + return count; } @Override diff --git a/modules/server/src/main/java/org/dromara/jpom/service/stat/NodeStatService.java b/modules/server/src/main/java/org/dromara/jpom/service/stat/NodeStatService.java deleted file mode 100644 index 46772f531..000000000 --- a/modules/server/src/main/java/org/dromara/jpom/service/stat/NodeStatService.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2019 Code Technology Studio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -///* -// * The MIT License (MIT) -// * -// * Copyright (c) 2019 Code Technology Studio -// * -// * Permission is hereby granted, free of charge, to any person obtaining a copy of -// * this software and associated documentation files (the "Software"), to deal in -// * the Software without restriction, including without limitation the rights to -// * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// * the Software, and to permit persons to whom the Software is furnished to do so, -// * subject to the following conditions: -// * -// * The above copyright notice and this permission notice shall be included in all -// * copies or substantial portions of the Software. -// * -// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// */ -//package io.jpom.service.stat; -// -//import cn.hutool.core.collection.CollUtil; -//import cn.hutool.core.date.SystemClock; -//import cn.hutool.core.thread.ThreadUtil; -//import cn.hutool.core.util.ObjectUtil; -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.db.Entity; -//import com.alibaba.fastjson2.JSONObject; -//import io.jpom.common.BaseServerController; -//import io.jpom.common.JsonMessage; -//import io.jpom.common.forward.NodeForward; -//import io.jpom.common.forward.NodeUrl; -//import io.jpom.cron.IAsyncLoad; -//import org.dromara.jpom.model.data.NodeModel; -//import io.jpom.model.log.SystemMonitorLog; -//import io.jpom.model.stat.NodeStatModel; -//import io.jpom.model.user.UserModel; -//import io.jpom.service.dblog.DbSystemMonitorLogService; -//import io.jpom.service.h2db.BaseWorkspaceService; -//import io.jpom.service.node.NodeService; -//import org.dromara.jpom.system.AgentException; -//import org.dromara.jpom.system.AuthorizeException; -//import org.dromara.jpom.system.ServerConfig; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.stereotype.Service; -// -//import java.util.Collection; -//import java.util.List; -//import java.util.concurrent.Executors; -//import java.util.concurrent.ScheduledExecutorService; -//import java.util.concurrent.TimeUnit; -//import java.util.stream.Collectors; -// -///** -// * 节点统计 service -// * -// * @author bwcx_jzy -// * @since 2022/1/22 -// */ -//@Service -//@Slf4j -//public class NodeStatService extends BaseWorkspaceService implements IAsyncLoad, Runnable { -// -// private final DbSystemMonitorLogService dbSystemMonitorLogService; -// private final NodeService nodeService; -// private final ServerConfig.NodeConfig nodeConfig; -// -// public NodeStatService(DbSystemMonitorLogService dbSystemMonitorLogService, -// NodeService nodeService, -// ServerConfig serverConfig) { -// this.dbSystemMonitorLogService = dbSystemMonitorLogService; -// this.nodeService = nodeService; -// this.nodeConfig = serverConfig.getNode(); -// } -// -// /** -// * 根据 url 去重 -// * -// * @return list -// */ -// public List getDeDuplicationByUrl() { -// String sql = "select url from " + super.getTableName() + " group by url"; -// List query = this.query(sql); -// if (query != null) { -// return query.stream().map((entity -> entity.getStr("url"))).collect(Collectors.toList()); -// } -// return null; -// } -// -// @Override -// public void startLoad() { -// // 启动心跳检测 -// int heartSecond = nodeConfig.getHeartSecond(); -// ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> new Thread(runnable, "Jpom Node Monitor")); -// scheduler.scheduleAtFixedRate(this, 10, heartSecond, TimeUnit.SECONDS); -// // 清理 错误的节点统计数据 -// List duplicationByUrl = nodeService.getDeDuplicationByUrl(); -// List statUrl = this.getDeDuplicationByUrl(); -// Collection subtract = CollUtil.subtract(statUrl, duplicationByUrl); -// // -// for (String s : subtract) { -// NodeStatModel statModel = new NodeStatModel(); -// statModel.setUrl(s); -// this.del(this.dataBeanToEntity(statModel)); -// } -// } -// -// @Override -// public void run() { -// List nodeModels = nodeService.listDeDuplicationByUrl(); -// // -// this.checkList(nodeModels); -// } -// -// -// private List getListByUrl(String url) { -// NodeModel nodeModel = new NodeModel(); -// nodeModel.setUrl(url); -// return nodeService.listByBean(nodeModel); -// } -// -// private void checkList(List nodeModels) { -// if (CollUtil.isEmpty(nodeModels)) { -// return; -// } -// nodeModels.forEach(nodeModel -> { -// // -// nodeModel.setName(nodeModel.getUrl()); -// List modelList = this.getListByUrl(nodeModel.getUrl()); -// boolean match = modelList.stream().allMatch(NodeModel::isOpenStatus); -// if (!match) { -// // 节点都关闭 -// try { -// BaseServerController.resetInfo(UserModel.EMPTY); -// this.save(modelList, 4, "节点禁用中"); -// } finally { -// BaseServerController.removeEmpty(); -// } -// return; -// } -// nodeModel.setOpenStatus(1); -// nodeModel.setTimeOut(5); -// // -// ThreadUtil.execute(() -> { -// try { -// BaseServerController.resetInfo(UserModel.EMPTY); -// JsonMessage message = NodeForward.request(reqNode, null, NodeUrl.GetDirectTop); -// JSONObject nodeTopInfo = this.getNodeTopInfo(nodeModel); -// // -// long timeMillis = SystemClock.now(); -// JsonMessage jsonMessage = NodeForward.request(nodeModel, NodeUrl.Status, "nodeId", nodeModel.getId()); -// int networkTime = (int) (System.currentTimeMillis() - timeMillis); -// JSONObject jsonObject; -// if (jsonMessage.success()) { -// jsonObject = jsonMessage.getData(JSONObject.class); -// } else { -// // 状态码错 -// jsonObject = new JSONObject(); -// jsonObject.put("status", 3); -// jsonObject.put("failureMsg", jsonMessage.toString()); -// } -// jsonObject.put("networkTime", networkTime); -// if (nodeTopInfo != null) { -// nodeTopInfo.put("networkTime", networkTime); -// } -// this.save(modelList, nodeTopInfo, jsonObject); -// } catch (AuthorizeException agentException) { -// this.save(modelList, 2, agentException.getMessage()); -// } catch (AgentException e) { -// this.save(modelList, 1, e.getMessage()); -// } catch (Exception e) { -// this.save(modelList, 1, e.getMessage()); -// log.error("获取节点监控信息失败", e); -// } finally { -// BaseServerController.removeEmpty(); -// } -// }); -// }); -// } -// -// private void saveSystemMonitor(List modelList, JSONObject systemMonitor) { -// if (systemMonitor != null) { -// List monitorLogs = modelList.stream().map(nodeModel -> { -// SystemMonitorLog log = new SystemMonitorLog(); -// log.setOccupyMemory(systemMonitor.getDouble("memory")); -// log.setOccupyMemoryUsed(systemMonitor.getDouble("memoryUsed")); -// log.setOccupyDisk(systemMonitor.getDouble("disk")); -// log.setOccupyCpu(systemMonitor.getDouble("cpu")); -// log.setMonitorTime(systemMonitor.getLongValue("time")); -// log.setNetworkTime(systemMonitor.getIntValue("networkTime")); -// log.setNodeId(nodeModel.getId()); -// return log; -// }).collect(Collectors.toList()); -// // -// dbSystemMonitorLogService.insert(monitorLogs); -// } -// } -// -// /** -// * 更新状态 和错误信息 -// * -// * @param modelList 节点 -// * @param satus 状态 -// * @param msg 错误消息 -// */ -// private void save(List modelList, int satus, String msg) { -// for (NodeModel nodeModel : modelList) { -// NodeStatModel nodeStatModel = this.create(nodeModel); -// nodeStatModel.setFailureMsg(msg); -// nodeStatModel.setStatus(satus); -// this.upsert(nodeStatModel); -// } -// } -// -// /** -// * 报错结果 -// * -// * @param modelList 节点 -// * @param systemMonitor 系统监控 -// * @param statusData 状态数据 -// */ -// private void save(List modelList, JSONObject systemMonitor, JSONObject statusData) { -// this.saveSystemMonitor(modelList, systemMonitor); -// // -// for (NodeModel nodeModel : modelList) { -// NodeStatModel nodeStatModel = this.create(nodeModel); -// if (nodeModel.isOpenStatus()) { -// if (systemMonitor != null) { -// nodeStatModel.setOccupyMemory(ObjectUtil.defaultIfNull(systemMonitor.getDouble("memory"), -1D)); -// nodeStatModel.setOccupyMemoryUsed(ObjectUtil.defaultIfNull(systemMonitor.getDouble("memoryUsed"), -1D)); -// nodeStatModel.setOccupyDisk(ObjectUtil.defaultIfNull(systemMonitor.getDouble("disk"), -1D)); -// nodeStatModel.setOccupyCpu(ObjectUtil.defaultIfNull(systemMonitor.getDouble("cpu"), -1D)); -// } -// // -// nodeStatModel.setNetworkTime(statusData.getIntValue("networkTime")); -// nodeStatModel.setJpomVersion(statusData.getString("jpomVersion")); -// nodeStatModel.setOsName(statusData.getString("osName")); -// String runTime = statusData.getString("runTime"); -// String runTimeLong = statusData.getString("runTimeLong"); -// // 兼容数据 -// nodeStatModel.setUpTimeStr(StrUtil.emptyToDefault(runTimeLong, runTime)); -// nodeStatModel.setFailureMsg(StrUtil.emptyToDefault(statusData.getString("failureMsg"), StrUtil.EMPTY)); -// // -// Integer statusInteger = statusData.getInteger("status"); -// if (statusInteger != null) { -// nodeStatModel.setStatus(statusInteger); -// } else { -// nodeStatModel.setStatus(0); -// } -// } else { -// nodeStatModel.setStatus(4); -// nodeStatModel.setFailureMsg("节点禁用中"); -// } -// this.upsert(nodeStatModel); -// } -// } -// -// private NodeStatModel create(NodeModel model) { -// NodeStatModel nodeStatModel = new NodeStatModel(); -// nodeStatModel.setId(model.getId()); -// nodeStatModel.setWorkspaceId(model.getWorkspaceId()); -// nodeStatModel.setName(model.getName()); -// nodeStatModel.setUrl(model.getUrl()); -// // -// nodeStatModel.setOccupyMemory(-1D); -// nodeStatModel.setOccupyMemoryUsed(-1D); -// nodeStatModel.setOccupyDisk(-1D); -// nodeStatModel.setOccupyCpu(-1D); -// nodeStatModel.setGroup(model.getGroup()); -// nodeStatModel.setNetworkTime(-1); -// nodeStatModel.setUpTimeStr(StrUtil.EMPTY); -// return nodeStatModel; -// } -//} diff --git a/modules/server/src/main/java/org/dromara/jpom/service/system/SystemParametersServer.java b/modules/server/src/main/java/org/dromara/jpom/service/system/SystemParametersServer.java index bebf20370..f70350566 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/system/SystemParametersServer.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/system/SystemParametersServer.java @@ -23,9 +23,9 @@ package org.dromara.jpom.service.system; import cn.hutool.core.util.ReflectUtil; +import cn.keepbx.jpom.model.BaseJsonModel; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.dromara.jpom.model.BaseJsonModel; import org.dromara.jpom.model.data.SystemParametersModel; import org.dromara.jpom.service.h2db.BaseDbService; import org.springframework.stereotype.Service; diff --git a/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceEnvVarService.java b/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceEnvVarService.java index c92e6cc5c..1437d1a5c 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceEnvVarService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceEnvVarService.java @@ -106,4 +106,17 @@ public class WorkspaceEnvVarService extends BaseWorkspaceService listByWorkspace(HttpServletRequest request) { + String workspaceIds = BaseWorkspaceService.getWorkspaceId(request); + List split = StrUtil.splitTrim(workspaceIds, StrUtil.COMMA); + for (String workspaceId : split) { + checkUserWorkspace(workspaceId); + } + Entity entity = Entity.create(); + entity.set("workspaceId", split); + List entities = super.queryList(entity); + return super.entityToBeanList(entities); + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceService.java b/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceService.java index b6ec4ef54..b06695dc8 100644 --- a/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceService.java +++ b/modules/server/src/main/java/org/dromara/jpom/service/system/WorkspaceService.java @@ -22,10 +22,8 @@ */ package org.dromara.jpom.service.system; -import cn.hutool.db.Entity; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.db.TableName; import org.dromara.jpom.model.BaseWorkspaceModel; import org.dromara.jpom.model.data.WorkspaceModel; @@ -33,11 +31,7 @@ import org.dromara.jpom.service.IStatusRecover; import org.dromara.jpom.service.h2db.BaseDbService; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * @author bwcx_jzy @@ -47,34 +41,6 @@ import java.util.stream.Stream; @Slf4j public class WorkspaceService extends BaseDbService implements IStatusRecover { - /** - * load date group by group name - * - * @return list - */ - public List listGroup() { - String sql = "select `GROUP` from " + getTableName() + " group by `GROUP`"; - List list = super.query(sql); - // 筛选字段 - return list.stream() - .flatMap(entity -> { - Object obj = entity.get(ServerConst.GROUP_STR); - if (obj == null) { - return null; - } - return Stream.of(String.valueOf(obj)); - }).filter(Objects::nonNull) - .distinct().collect(Collectors.toList()); - } - - /** - * 恢复字段 - */ - private void repairGroupFiled() { - String sql = "update " + getTableName() + " set `GROUP`=? where `GROUP` is null or `GROUP`=''"; - super.execute(sql, Const.DEFAULT_GROUP_NAME); - } - @Override public int statusRecover() { WorkspaceModel workspaceModel = super.getByKey(Const.WORKSPACE_DEFAULT_ID); @@ -102,8 +68,6 @@ public class WorkspaceService extends BaseDbService implements I } total += execute; } - // - this.repairGroupFiled(); return total; } } diff --git a/modules/server/src/main/java/org/dromara/jpom/socket/ServerScriptProcessBuilder.java b/modules/server/src/main/java/org/dromara/jpom/socket/ServerScriptProcessBuilder.java index e95efc465..abe7041cf 100644 --- a/modules/server/src/main/java/org/dromara/jpom/socket/ServerScriptProcessBuilder.java +++ b/modules/server/src/main/java/org/dromara/jpom/socket/ServerScriptProcessBuilder.java @@ -30,10 +30,10 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.EnvironmentMapBuilder; import org.dromara.jpom.model.script.ScriptModel; import org.dromara.jpom.script.BaseRunScript; diff --git a/modules/server/src/main/java/org/dromara/jpom/socket/handler/DockerCliHandler.java b/modules/server/src/main/java/org/dromara/jpom/socket/handler/DockerCliHandler.java index 48be61775..2091077e1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/socket/handler/DockerCliHandler.java +++ b/modules/server/src/main/java/org/dromara/jpom/socket/handler/DockerCliHandler.java @@ -34,6 +34,7 @@ import com.alibaba.fastjson2.JSONValidator; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.func.assets.model.MachineDockerModel; import org.dromara.jpom.func.assets.server.MachineDockerServer; +import org.dromara.jpom.model.docker.DockerInfoModel; import org.dromara.jpom.permission.ClassFeature; import org.dromara.jpom.permission.Feature; import org.dromara.jpom.permission.MethodFeature; @@ -71,10 +72,14 @@ public class DockerCliHandler extends BaseTerminalHandler { MachineDockerServer machineDockerServer = SpringUtil.getBean(MachineDockerServer.class); Map attributes = session.getAttributes(); MachineDockerModel dockerInfoModel = (MachineDockerModel) attributes.get("machineDocker"); + DockerInfoService dockerInfoService = SpringUtil.getBean(DockerInfoService.class); String containerId = (String) attributes.get("containerId"); // HandlerItem handlerItem; try { + DockerInfoModel model = new DockerInfoModel(); + model.setMachineDockerId(dockerInfoModel.getId()); + model = dockerInfoService.queryByBean(model); Map parameter = machineDockerServer.toParameter(dockerInfoModel); handlerItem = new HandlerItem(session, dockerInfoModel, parameter, containerId); handlerItem.startRead(); diff --git a/modules/server/src/main/java/org/dromara/jpom/socket/handler/NodeUpdateHandler.java b/modules/server/src/main/java/org/dromara/jpom/socket/handler/NodeUpdateHandler.java index e7e2f0c08..9a7670ac9 100644 --- a/modules/server/src/main/java/org/dromara/jpom/socket/handler/NodeUpdateHandler.java +++ b/modules/server/src/main/java/org/dromara/jpom/socket/handler/NodeUpdateHandler.java @@ -30,11 +30,11 @@ import cn.hutool.core.lang.Tuple; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; import cn.keepbx.jpom.Type; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.JpomManifest; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; import org.dromara.jpom.func.assets.model.MachineNodeModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/socket/handler/ServerScriptHandler.java b/modules/server/src/main/java/org/dromara/jpom/socket/handler/ServerScriptHandler.java index cf5d37ffe..49f3f9944 100644 --- a/modules/server/src/main/java/org/dromara/jpom/socket/handler/ServerScriptHandler.java +++ b/modules/server/src/main/java/org/dromara/jpom/socket/handler/ServerScriptHandler.java @@ -24,10 +24,10 @@ package org.dromara.jpom.socket.handler; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import org.dromara.jpom.common.BaseServerController; import org.dromara.jpom.common.Const; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.script.ScriptExecuteLogModel; import org.dromara.jpom.model.script.ScriptModel; import org.dromara.jpom.model.user.UserModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/socket/handler/SshHandler.java b/modules/server/src/main/java/org/dromara/jpom/socket/handler/SshHandler.java index 74549a393..ec171041b 100644 --- a/modules/server/src/main/java/org/dromara/jpom/socket/handler/SshHandler.java +++ b/modules/server/src/main/java/org/dromara/jpom/socket/handler/SshHandler.java @@ -37,6 +37,7 @@ import com.jcraft.jsch.ChannelShell; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; +import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.func.assets.model.MachineSshModel; import org.dromara.jpom.model.data.SshModel; import org.dromara.jpom.model.user.UserModel; @@ -108,6 +109,7 @@ public class SshHandler extends BaseTerminalHandler { // HandlerItem handlerItem; try { + // handlerItem = new HandlerItem(session, machineSshModel, sshModel); handlerItem.startRead(); } catch (Exception e) { diff --git a/modules/server/src/main/java/org/dromara/jpom/system/AuthorizeException.java b/modules/server/src/main/java/org/dromara/jpom/system/AuthorizeException.java index 85bf04c54..4f66f4cc6 100644 --- a/modules/server/src/main/java/org/dromara/jpom/system/AuthorizeException.java +++ b/modules/server/src/main/java/org/dromara/jpom/system/AuthorizeException.java @@ -22,7 +22,8 @@ */ package org.dromara.jpom.system; -import org.dromara.jpom.common.JsonMessage; +import cn.keepbx.jpom.IJsonMessage; +import cn.keepbx.jpom.model.JsonMessage; /** * 授权错误 @@ -38,7 +39,7 @@ public class AuthorizeException extends RuntimeException { this.jsonMessage = jsonMessage; } - public JsonMessage getJsonMessage() { + public IJsonMessage getJsonMessage() { return jsonMessage; } } diff --git a/modules/server/src/main/java/org/dromara/jpom/system/ServerConfig.java b/modules/server/src/main/java/org/dromara/jpom/system/ServerConfig.java index f888c1f31..2e5e60da6 100644 --- a/modules/server/src/main/java/org/dromara/jpom/system/ServerConfig.java +++ b/modules/server/src/main/java/org/dromara/jpom/system/ServerConfig.java @@ -23,15 +23,18 @@ package org.dromara.jpom.system; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Validator; import cn.hutool.core.util.RuntimeUtil; import cn.hutool.core.util.StrUtil; import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.jpom.JpomApplication; import org.dromara.jpom.common.BaseServerController; +import org.dromara.jpom.common.Const; import org.dromara.jpom.model.AgentFileModel; import org.dromara.jpom.model.user.UserModel; import org.dromara.jpom.socket.ServiceFileTailWatcher; +import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -48,7 +51,7 @@ import java.util.Optional; @Configuration @ConfigurationProperties("jpom") @Data -public class ServerConfig extends BaseExtConfig { +public class ServerConfig extends BaseExtConfig implements InitializingBean { private final JpomApplication configBean; @@ -56,6 +59,11 @@ public class ServerConfig extends BaseExtConfig { this.configBean = configBean; } + /** + * 集群 配置信息 + */ + private ClusterConfig cluster; + /** * 系统配置参数 */ @@ -153,6 +161,27 @@ public class ServerConfig extends BaseExtConfig { return file; } + /** + * 获取当前集群 Id + * + * @return 集群Id + */ + public ClusterConfig getCluster() { + return Optional.ofNullable(this.cluster).orElseGet(() -> { + this.cluster = new ClusterConfig(); + return this.cluster; + }); + } + + @Override + public void afterPropertiesSet() throws Exception { + ClusterConfig clusterConfig = this.getCluster(); + String clusterId1 = clusterConfig.getId(); + if (!Validator.isGeneral(clusterId1, 1, 20)) { + throw new JpomRuntimeException("请配置正确的集群Id,【jpom.clusterId】"); + } + } + @Data public static class WebConfig { @@ -356,8 +385,34 @@ public class ServerConfig extends BaseExtConfig { return FileUtil.file(fileStorage.getSavePah()); } + /** + * 文件管理存储 + */ @Data public static class FileStorageConfig { private String savePah; } + + /** + * 集群信息 + */ + @Data + public static class ClusterConfig { + /** + * 集群Id,默认为 default 不区分大小写,只能是字母或者数字,长度小于 20 + */ + private String id; + /** + * 检查节点心跳间隔时间,最小值 5 秒 + */ + private int heartSecond = 30; + + public int getHeartSecond() { + return Math.max(this.heartSecond, 5); + } + + public String getId() { + return StrUtil.emptyToDefault(this.id, Const.WORKSPACE_DEFAULT_ID).toUpperCase(); + } + } } diff --git a/modules/server/src/main/java/org/dromara/jpom/system/db/DataInitEvent.java b/modules/server/src/main/java/org/dromara/jpom/system/db/DataInitEvent.java index 912dfd695..7f21ed1d1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/system/db/DataInitEvent.java +++ b/modules/server/src/main/java/org/dromara/jpom/system/db/DataInitEvent.java @@ -26,16 +26,15 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; import cn.hutool.extra.spring.SpringUtil; import cn.keepbx.jpom.event.ICacheTask; +import cn.keepbx.jpom.model.BaseIdModel; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.ILoadEvent; import org.dromara.jpom.common.ServerConst; import org.dromara.jpom.db.TableName; -import org.dromara.jpom.model.BaseIdModel; import org.dromara.jpom.model.BaseWorkspaceModel; import org.dromara.jpom.model.data.WorkspaceModel; import org.dromara.jpom.service.IStatusRecover; -import org.dromara.jpom.service.h2db.BaseGroupService; -import org.dromara.jpom.service.h2db.BaseNodeGroupService; +import org.dromara.jpom.service.h2db.BaseDbService; import org.dromara.jpom.service.h2db.BaseNodeService; import org.dromara.jpom.service.system.WorkspaceService; import org.springframework.context.ApplicationContext; @@ -68,15 +67,12 @@ public class DataInitEvent implements ILoadEvent, ICacheTask { @Override public void afterPropertiesSet(ApplicationContext applicationContext) throws Exception { - // - Map groupServiceMap = SpringUtil.getApplicationContext().getBeansOfType(BaseGroupService.class); - for (BaseGroupService value : groupServiceMap.values()) { - value.repairGroupFiled(); - } - // - Map nodeGroupServiceMap = SpringUtil.getApplicationContext().getBeansOfType(BaseNodeGroupService.class); - for (BaseNodeGroupService value : nodeGroupServiceMap.values()) { - value.repairGroupFiled(); + // 分组 + Map groupServiceMap = SpringUtil.getApplicationContext().getBeansOfType(BaseDbService.class); + for (BaseDbService value : groupServiceMap.values()) { + if (value.isCanGroup()) { + value.repairGroupFiled(); + } } // 状态恢复的数据 Map statusRecoverMap = SpringUtil.getApplicationContext().getBeansOfType(IStatusRecover.class); @@ -103,11 +99,17 @@ public class DataInitEvent implements ILoadEvent, ICacheTask { errorWorkspaceTable.clear(); // 判断是否存在关联数据 Set workspaceIds = this.allowWorkspaceIds(); - Set> classes = BaseWorkspaceModel.allClass(); + Set> classes = BaseWorkspaceModel.allTableClass(); for (Class aClass : classes) { TableName tableName = aClass.getAnnotation(TableName.class); - if (tableName == null) { - continue; + int workspaceBind = tableName.workspaceBind(); + if (workspaceBind == 3) { + // 父级不存在自动删除 + Class parents = tableName.parents(); + Assert.state(parents != Void.class, "表信息配置错误," + aClass); + // + TableName tableName1 = parents.getAnnotation(TableName.class); + Assert.notNull(tableName1, "父级表信息配置错误," + aClass); } String sql = "select `workspaceId`,count(1) as allCount from " + tableName.value() + " group by `workspaceId`"; List query = workspaceService.query(sql); @@ -129,10 +131,10 @@ public class DataInitEvent implements ILoadEvent, ICacheTask { // 判断是否存在关联数据 List list = workspaceService.list(); Set workspaceIds = Optional.ofNullable(list) - .map(workspaceModels -> workspaceModels.stream() - .map(BaseIdModel::getId) - .collect(Collectors.toSet())) - .orElse(new HashSet<>()); + .map(workspaceModels -> workspaceModels.stream() + .map(BaseIdModel::getId) + .collect(Collectors.toSet())) + .orElse(new HashSet<>()); // 添加默认的全局工作空间 id workspaceIds.add(ServerConst.WORKSPACE_GLOBAL); return workspaceIds; diff --git a/modules/server/src/main/java/org/dromara/jpom/system/db/InitDb.java b/modules/server/src/main/java/org/dromara/jpom/system/db/InitDb.java index a42a88fcb..6df2e41a1 100644 --- a/modules/server/src/main/java/org/dromara/jpom/system/db/InitDb.java +++ b/modules/server/src/main/java/org/dromara/jpom/system/db/InitDb.java @@ -79,7 +79,8 @@ public class InitDb implements DisposableBean, ILoadEvent { */ private File recoverSqlFile; - public InitDb(DbExtConfig dbExtConfig, BackupInfoService backupInfoService) { + public InitDb(DbExtConfig dbExtConfig, + BackupInfoService backupInfoService) { this.dbExtConfig = dbExtConfig; this.backupInfoService = backupInfoService; } diff --git a/modules/server/src/main/java/org/dromara/jpom/system/init/OperateLogController.java b/modules/server/src/main/java/org/dromara/jpom/system/init/OperateLogController.java index f4f6fe20e..19592d0a9 100644 --- a/modules/server/src/main/java/org/dromara/jpom/system/init/OperateLogController.java +++ b/modules/server/src/main/java/org/dromara/jpom/system/init/OperateLogController.java @@ -28,6 +28,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; import cn.hutool.extra.servlet.ServletUtil; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONValidator; @@ -38,7 +39,6 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.reflect.MethodSignature; import org.dromara.jpom.common.BaseServerController; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.model.data.NodeModel; import org.dromara.jpom.model.log.UserOperateLogV1; import org.dromara.jpom.model.user.UserModel; diff --git a/modules/server/src/main/java/org/dromara/jpom/system/init/ServerCheckMonitor.java b/modules/server/src/main/java/org/dromara/jpom/system/init/ServerCheckMonitor.java index 80cade4fb..7298fa5bc 100644 --- a/modules/server/src/main/java/org/dromara/jpom/system/init/ServerCheckMonitor.java +++ b/modules/server/src/main/java/org/dromara/jpom/system/init/ServerCheckMonitor.java @@ -23,12 +23,11 @@ package org.dromara.jpom.system.init; import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.extra.spring.SpringUtil; import cn.keepbx.jpom.event.ISystemTask; +import cn.keepbx.jpom.model.JsonMessage; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.common.ILoadEvent; -import org.dromara.jpom.common.JsonMessage; import org.dromara.jpom.common.RemoteVersion; import org.dromara.jpom.common.forward.NodeForward; import org.dromara.jpom.common.forward.NodeUrl; @@ -54,6 +53,18 @@ import java.util.List; @Slf4j public class ServerCheckMonitor implements ILoadEvent, ISystemTask { + private final NodeService nodeService; + private final NodeScriptServer nodeScriptServer; + private final NodeScriptExecuteLogServer nodeScriptExecuteLogServer; + + public ServerCheckMonitor(NodeService nodeService, + NodeScriptServer nodeScriptServer, + NodeScriptExecuteLogServer nodeScriptExecuteLogServer) { + this.nodeService = nodeService; + this.nodeScriptServer = nodeScriptServer; + this.nodeScriptExecuteLogServer = nodeScriptExecuteLogServer; + } + /** * 同步 节点的脚本模版日志 * @@ -61,7 +72,7 @@ public class ServerCheckMonitor implements ILoadEvent, ISystemTask { */ private void pullScriptLogItem(NodeModel nodeModel) { try { - NodeScriptExecuteLogServer nodeScriptExecuteLogServer = SpringUtil.getBean(NodeScriptExecuteLogServer.class); + //NodeScriptExecuteLogServer nodeScriptExecuteLogServer = SpringUtil.getBean(NodeScriptExecuteLogServer.class); Collection strings = nodeScriptExecuteLogServer.syncExecuteNodeInc(nodeModel); if (strings == null) { return; @@ -82,8 +93,8 @@ public class ServerCheckMonitor implements ILoadEvent, ISystemTask { public void afterPropertiesSet(ApplicationContext applicationContext) throws Exception { // 拉取 脚本模版日志 CronUtils.upsert("pull_script_log", "0 0/1 * * * ?", () -> { - NodeService nodeService = SpringUtil.getBean(NodeService.class); - NodeScriptServer nodeScriptServer = SpringUtil.getBean(NodeScriptServer.class); + //NodeService nodeService = SpringUtil.getBean(NodeService.class); + //NodeScriptServer nodeScriptServer = SpringUtil.getBean(NodeScriptServer.class); List nodeIds = nodeScriptServer.hasScriptNode(); if (nodeIds == null) { return; diff --git a/modules/server/src/main/resources/application.yml b/modules/server/src/main/resources/application.yml index 9e14a3549..2438bf5db 100644 --- a/modules/server/src/main/resources/application.yml +++ b/modules/server/src/main/resources/application.yml @@ -1,6 +1,12 @@ jpom: # jpom 数据存储路径, 如果调试模式运行默认路径为【${user.home}/jpom/】,安装运行默认为jar包文件的父级 path: + # 集群配置 + cluster: + # 集群Id,默认为 default 不区分大小写,只能是字母或者数字,长度小于 20 + id: default + # 心跳监控时间 (需要大于零) 单位秒 最小配置 5 秒 + heart-second: 30 node: # 节点心跳监控时间 (需要大于零) 单位秒 最小配置 5秒 heart-second: 30 diff --git a/modules/server/src/main/resources/config_default/application.yml b/modules/server/src/main/resources/config_default/application.yml index c7e1a70db..55d0176d5 100644 --- a/modules/server/src/main/resources/config_default/application.yml +++ b/modules/server/src/main/resources/config_default/application.yml @@ -1,6 +1,12 @@ jpom: # jpom 数据存储路径, 如果调试模式运行默认路径为【${user.home}/jpom/】,安装运行默认为jar包文件的父级 path: + # 集群配置 + cluster: + # 集群Id,默认为 default 不区分大小写,只能是字母或者数字,长度小于 20 + id: default + # 心跳监控时间 (需要大于零) 单位秒 最小配置 5 秒 + heart-second: 30 node: # 节点心跳监控时间 (需要大于零) 单位秒 最小配置 5秒 heart-second: 30 diff --git a/modules/server/src/main/resources/menus/system.json b/modules/server/src/main/resources/menus/system.json index c9a144178..613d7cda5 100644 --- a/modules/server/src/main/resources/menus/system.json +++ b/modules/server/src/main/resources/menus/system.json @@ -82,7 +82,7 @@ "childs": [ { "id": "workspace", - "title": "工作空间", + "title": "工作空间&集群", "role": "system" }, { diff --git a/modules/server/src/main/resources/sql-view/alter.all.v1.3.csv b/modules/server/src/main/resources/sql-view/alter.all.v1.3.csv index e6a3838c9..678d0ab86 100644 --- a/modules/server/src/main/resources/sql-view/alter.all.v1.3.csv +++ b/modules/server/src/main/resources/sql-view/alter.all.v1.3.csv @@ -58,3 +58,8 @@ ADD,SCRIPT_EXECUTE_LOG,workspaceName,String,50,,工作空间名称,false ALTER,REPOSITORY,password,String,255,,登录密码,false ADD,WORKSPACE,group,String,50,,分组,false ADD,MACHINE_SSH_INFO,dockerInfo,String,255,,服务器中的 docker 信息,false +ADD,MACHINE_DOCKER_INFO,enableSsh,tinyint,0,,是否开启SSH连接,false +ADD,MACHINE_DOCKER_INFO,machineSshId,String,255,,SSH连接信息,false +ADD,BUILD_INFO,resultKeepDay,Integer,,,产物保留天数,false +ADD,REPOSITORY,group,String,50,,分组,false +ADD,WORKSPACE,clusterInfoId,String,50,,绑定集群id,false diff --git a/modules/server/src/main/resources/sql-view/table.all.v1.2.csv b/modules/server/src/main/resources/sql-view/table.all.v1.2.csv new file mode 100644 index 000000000..06d72bf35 --- /dev/null +++ b/modules/server/src/main/resources/sql-view/table.all.v1.2.csv @@ -0,0 +1,12 @@ +tableName,name,type,len,defaultValue,notNull,primaryKey,comment,tableComment +CLUSTER_INFO,id,String,50,,true,true,id,机器节点信息 +CLUSTER_INFO,createTimeMillis,Long,,,false,false,数据创建时间, +CLUSTER_INFO,modifyTimeMillis,Long,,,false,false,数据修改时间, +CLUSTER_INFO,modifyUser,String,50,,false,false,修改人, +CLUSTER_INFO,name,String,50,,true,false,集群名称, +CLUSTER_INFO,clusterId,String,50,,true,false,集群Id, +CLUSTER_INFO,url,String,255,,false,false,集群地址, +CLUSTER_INFO,linkGroup,String,500,,false,false,集群地址, +CLUSTER_INFO,lastHeartbeat,Long,,,false,false,最后心跳, +CLUSTER_INFO,localHostName,String,255,,false,false,主机名, +CLUSTER_INFO,jpomVersion,String,255,,false,false,jpom版本, diff --git a/modules/server/src/test/java/TestIntegral.java b/modules/server/src/test/java/TestIntegral.java new file mode 100644 index 000000000..4c2c2b08a --- /dev/null +++ b/modules/server/src/test/java/TestIntegral.java @@ -0,0 +1,60 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.comparator.CompareUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.ArrayList; +import java.util.IntSummaryStatistics; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author bwcx_jzy + * @since 2023/6/14 + */ +public class TestIntegral { + + public static void main(String[] args) { + List list = FileUtil.readLines("D:\\System-Data\\Documents\\WeChat Files\\A22838106\\FileStorage\\File\\2023-06\\积分签到.ini", CharsetUtil.CHARSET_GBK); + List> collect = list.stream() + .filter(s -> StrUtil.contains(s, "目前积分")) + .map(s -> StrUtil.splitTrim(s, "=")) + .collect(Collectors.toList()); + // + Map statisticsMap = CollStreamUtil.groupBy(collect, strings -> strings.get(0), Collectors.summarizingInt(value -> Convert.toInt(value.get(1)))); + // + List> sortedList = new ArrayList<>(statisticsMap.entrySet()); + sortedList.sort(Map.Entry.comparingByValue((o1, o2) -> CompareUtil.compare(o2.getSum(), o1.getSum()))); + // + List> subbed = CollUtil.sub(sortedList, 0, 10); + for (Map.Entry statisticsEntry : subbed) { + System.out.println(statisticsEntry.getKey() + " " + statisticsEntry.getValue().getSum()); + } + } +} diff --git a/modules/server/src/test/java/TestIp.java b/modules/server/src/test/java/TestIp.java index b82f1e7f4..f0d9db6d8 100644 --- a/modules/server/src/test/java/TestIp.java +++ b/modules/server/src/test/java/TestIp.java @@ -62,6 +62,7 @@ public class TestIp { @Test public void test1() { - + String localHostName = NetUtil.getLocalHostName(); + System.out.println(localHostName); } } diff --git a/modules/server/src/test/java/TopTest.java b/modules/server/src/test/java/TopTest.java index 36c57a5ae..f064b47d0 100644 --- a/modules/server/src/test/java/TopTest.java +++ b/modules/server/src/test/java/TopTest.java @@ -62,7 +62,7 @@ public class TopTest { } else { is = process.getErrorStream(); } - result = IoUtil.read(is, CharsetUtil.GBK); + result = IoUtil.read(is, CharsetUtil.CHARSET_GBK); is.close(); process.destroy(); } catch (IOException | InterruptedException e) { diff --git a/modules/storage-module/pom.xml b/modules/storage-module/pom.xml index 8ddce9938..a354b22c8 100644 --- a/modules/storage-module/pom.xml +++ b/modules/storage-module/pom.xml @@ -29,7 +29,7 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml pom @@ -39,7 +39,7 @@ storage-module-mysql 4.0.0 - 2.10.41 + 2.10.42.4 org.dromara.jpom.storage-module jpom-storage-module-parent Jpom storage module diff --git a/modules/storage-module/storage-module-common/pom.xml b/modules/storage-module/storage-module-common/pom.xml index aff6228f2..27d89b747 100644 --- a/modules/storage-module/storage-module-common/pom.xml +++ b/modules/storage-module/storage-module-common/pom.xml @@ -30,7 +30,7 @@ org.dromara.jpom.storage-module jpom-storage-module-parent - 2.10.41 + 2.10.42.4 ../pom.xml diff --git a/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/BaseDbCommonService.java b/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/BaseDbCommonService.java index 9cb2fc138..79beb57e6 100644 --- a/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/BaseDbCommonService.java +++ b/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/BaseDbCommonService.java @@ -95,11 +95,11 @@ public abstract class BaseDbCommonService { * * @param t 数据 */ - protected final void insertDb(T t) { + protected final int insertDb(T t) { Db db = Db.use(this.getDataSource()); try { Entity entity = this.dataBeanToEntity(t); - db.insert(entity); + return db.insert(entity); } catch (Exception e) { throw warpException(e); } @@ -373,6 +373,15 @@ public abstract class BaseDbCommonService { } } + public Number queryNumber(String sql, Object... params) { + try { + return Db.use(this.getDataSource()).queryNumber(sql, params); + } catch (Exception e) { + throw warpException(e); + } + } + + /** * sql 执行 * diff --git a/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/TableName.java b/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/TableName.java index f19478d01..1703c205a 100644 --- a/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/TableName.java +++ b/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/db/TableName.java @@ -56,4 +56,22 @@ public @interface TableName { * @return 默认所有模式 */ DbExtConfig.Mode[] modes() default {}; + + /** + * 父级 + * + * @return class + */ + Class parents() default Void.class; + + /** + * 绑定关系 + *

+ * 1 严格模式,需要手动删除 + * 2 删除工作空间时自动删除 + * 3 父级数据为空时可以自动删除 + * + * @return 数据绑定关系 + */ + int workspaceBind() default 1; } diff --git a/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/model/BaseDbModel.java b/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/model/BaseDbModel.java index 2da96f8f5..30b5b5792 100644 --- a/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/model/BaseDbModel.java +++ b/modules/storage-module/storage-module-common/src/main/java/org/dromara/jpom/model/BaseDbModel.java @@ -23,6 +23,7 @@ package org.dromara.jpom.model; import cn.hutool.core.date.SystemClock; +import cn.keepbx.jpom.model.BaseIdModel; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/modules/storage-module/storage-module-h2/pom.xml b/modules/storage-module/storage-module-h2/pom.xml index 4c54d92cc..21067d34f 100644 --- a/modules/storage-module/storage-module-h2/pom.xml +++ b/modules/storage-module/storage-module-h2/pom.xml @@ -30,7 +30,7 @@ org.dromara.jpom.storage-module jpom-storage-module-parent - 2.10.41 + 2.10.42.4 ../pom.xml @@ -40,7 +40,7 @@ 8 8 UTF-8 - 2.1.214 + 2.2.220 diff --git a/modules/storage-module/storage-module-mysql/pom.xml b/modules/storage-module/storage-module-mysql/pom.xml index 4903eac20..9528a9c9c 100644 --- a/modules/storage-module/storage-module-mysql/pom.xml +++ b/modules/storage-module/storage-module-mysql/pom.xml @@ -30,7 +30,7 @@ org.dromara.jpom.storage-module jpom-storage-module-parent - 2.10.41 + 2.10.42.4 ../pom.xml diff --git a/modules/sub-plugin/docker-cli/pom.xml b/modules/sub-plugin/docker-cli/pom.xml index f54ec8c64..cb651053e 100644 --- a/modules/sub-plugin/docker-cli/pom.xml +++ b/modules/sub-plugin/docker-cli/pom.xml @@ -29,7 +29,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml 4.0.0 @@ -39,7 +39,8 @@ 8 8 - 3.3.1 + 3.3.2 + 0.2.7 @@ -59,6 +60,10 @@ org.bouncycastle bcpkix-jdk15on + + org.apache.commons + commons-compress + @@ -71,6 +76,12 @@ docker-java-transport-httpclient5 ${docker-java-version} + + + org.dromara.jpom.plugins + ssh-jsch + ${pom.version} + diff --git a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerCheckPluginImpl.java b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerCheckPluginImpl.java index 501fc7d9a..55fcf2fc4 100644 --- a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerCheckPluginImpl.java +++ b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerCheckPluginImpl.java @@ -152,7 +152,7 @@ public class DefaultDockerCheckPluginImpl implements IDefaultPlugin { URI dockerHost = config.getDockerHost(); String host = dockerHost.toString(); try (DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder() - .dockerHost(dockerHost).connectionTimeout(Duration.ofSeconds(3)).build()) { + .dockerHost(dockerHost).connectionTimeout(Duration.ofSeconds(3)).build()) { try (PingCmd pingCmd = DockerClientImpl.getInstance(config, httpClient).pingCmd()) { pingCmd.exec(); return host; @@ -201,7 +201,7 @@ public class DefaultDockerCheckPluginImpl implements IDefaultPlugin { return "SSL 无法连接(请检查证书信任的地址和配置的 docker host 是否一致):" + e.getMessage(); } log.warn("检查 docker url 异常 {}", e.getMessage()); - return e.getMessage(); + return StrUtil.emptyToDefault(e.getMessage(), "检查 docker 异常"); } } @@ -226,6 +226,7 @@ public class DefaultDockerCheckPluginImpl implements IDefaultPlugin { case "tcp": case "unix": case "npipe": + case "ssh": return true; default: return false; @@ -240,27 +241,27 @@ public class DefaultDockerCheckPluginImpl implements IDefaultPlugin { private List getApiVersions() { Field[] fields = ReflectUtil.getFields(RemoteApiVersion.class); return Arrays.stream(fields) - .map(field -> { - boolean aFinal = Modifier.isFinal(field.getModifiers()); - boolean aStatic = Modifier.isStatic(field.getModifiers()); - boolean aPublic = Modifier.isPublic(field.getModifiers()); - if (!aFinal || !aStatic || !aPublic) { - return null; - } - Object fieldValue = ReflectUtil.getFieldValue(null, field); - if (fieldValue instanceof RemoteApiVersion) { - return (RemoteApiVersion) fieldValue; - } + .map(field -> { + boolean aFinal = Modifier.isFinal(field.getModifiers()); + boolean aStatic = Modifier.isStatic(field.getModifiers()); + boolean aPublic = Modifier.isPublic(field.getModifiers()); + if (!aFinal || !aStatic || !aPublic) { return null; - }) - .filter(apiVersion -> apiVersion != null && apiVersion != RemoteApiVersion.UNKNOWN_VERSION) - .sorted((o1, o2) -> StrUtil.compareVersion(o2.getVersion(), o1.getVersion())).map(apiVersion -> { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("webVersion", apiVersion.asWebPathPart()); - jsonObject.put("version", apiVersion.getVersion()); - return jsonObject; - }) - .collect(Collectors.toList()); + } + Object fieldValue = ReflectUtil.getFieldValue(null, field); + if (fieldValue instanceof RemoteApiVersion) { + return (RemoteApiVersion) fieldValue; + } + return null; + }) + .filter(apiVersion -> apiVersion != null && apiVersion != RemoteApiVersion.UNKNOWN_VERSION) + .sorted((o1, o2) -> StrUtil.compareVersion(o2.getVersion(), o1.getVersion())).map(apiVersion -> { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("webVersion", apiVersion.asWebPathPart()); + jsonObject.put("version", apiVersion.getVersion()); + return jsonObject; + }) + .collect(Collectors.toList()); } /** diff --git a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerPluginImpl.java b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerPluginImpl.java index a01fd4b5f..02c1dfa43 100644 --- a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerPluginImpl.java +++ b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DefaultDockerPluginImpl.java @@ -41,6 +41,7 @@ import com.github.dockerjava.core.InvocationBuilder; import com.github.dockerjava.core.NameParser; import lombok.Lombok; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.dromara.jpom.util.StringUtil; import org.springframework.util.Assert; @@ -61,6 +62,7 @@ import java.util.stream.Collectors; * @since 2022/1/26 */ @PluginConfig(name = "docker-cli") +@Slf4j public class DefaultDockerPluginImpl implements IDockerConfigPlugin { @@ -571,7 +573,7 @@ public class DefaultDockerPluginImpl implements IDockerConfigPlugin { dockerClient.removeImageCmd(imageId).withForce(false).exec(); successCount++; } catch (Exception e) { - + log.warn("删除容器异常", e); } } failCount = imagesIds.length - successCount; diff --git a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DockerUtil.java b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DockerUtil.java index a12d3a0fd..e10af9b42 100644 --- a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DockerUtil.java +++ b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/DockerUtil.java @@ -40,12 +40,15 @@ import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; +import org.dromara.jpom.ssh.JschDockerHttpClient; import java.io.File; import java.time.Duration; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; /** * @author bwcx_jzy @@ -103,6 +106,7 @@ public class DockerUtil { String registryPassword = (String) parameter.get("registryPassword"); String registryEmail = (String) parameter.get("registryEmail"); String registryUrl = (String) parameter.get("registryUrl"); + Supplier sessionSupplier = (Supplier) parameter.get("session"); // DefaultDockerClientConfig.Builder defaultConfigBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder(); defaultConfigBuilder @@ -116,20 +120,25 @@ public class DockerUtil { Opt.ofBlankAble(registryUsername).ifPresent(s -> defaultConfigBuilder.withRegistryUsername(registryUsername)); Opt.ofBlankAble(registryPassword).ifPresent(s -> defaultConfigBuilder.withRegistryPassword(registryPassword)); + DockerClient dockerClient; DockerClientConfig config = defaultConfigBuilder.build(); - // - ApacheDockerHttpClient.Builder builder = new ApacheDockerHttpClient.Builder() - .dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()) - .maxConnections(100); - // - int timeout = Convert.toInt(parameter.get("timeout"), 0); - if (timeout > 0) { - builder.connectionTimeout(Duration.ofSeconds(timeout)); - builder.responseTimeout(Duration.ofSeconds(timeout)); + if (sessionSupplier != null) { + // 通过SSH连接Docker + JschDockerHttpClient httpClient = new JschDockerHttpClient(config.getDockerHost(), sessionSupplier); + dockerClient = DockerClientImpl.getInstance(config, httpClient); + } else { + ApacheDockerHttpClient.Builder builder = new ApacheDockerHttpClient.Builder() + .dockerHost(config.getDockerHost()) + .sslConfig(config.getSSLConfig()) + .maxConnections(100); + int timeout = Convert.toInt(parameter.get("timeout"), 0); + if (timeout > 0) { + builder.connectionTimeout(Duration.ofSeconds(timeout)); + builder.responseTimeout(Duration.ofSeconds(timeout)); + } + ApacheDockerHttpClient httpClient = builder.build(); + dockerClient = DockerClientImpl.getInstance(config, httpClient); } - ApacheDockerHttpClient httpClient = builder.build(); - DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient); if (StrUtil.isNotEmpty(registryUrl)) { AuthConfig authConfig = dockerClient.authConfig(); AuthResponse authResponse = dockerClient.authCmd().withAuthConfig(authConfig).exec(); diff --git a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/HijackingHttpRequestExecutor.java b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/HijackingHttpRequestExecutor.java new file mode 100644 index 000000000..ed700a9dd --- /dev/null +++ b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/HijackingHttpRequestExecutor.java @@ -0,0 +1,166 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.dromara.jpom.ssh; + +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.impl.io.HttpRequestExecutor; +import org.apache.hc.core5.http.io.HttpClientConnection; +import org.apache.hc.core5.http.io.HttpResponseInformationCallback; +import org.apache.hc.core5.http.io.entity.AbstractHttpEntity; +import org.apache.hc.core5.http.message.BasicClassicHttpRequest; +import org.apache.hc.core5.http.message.StatusLine; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.http.protocol.HttpCoreContext; +import org.apache.hc.core5.io.Closer; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Objects; + +/** + * https://github.com/docker-java/docker-java + * + * @author docker-java-transport-httpclient5 + */ +class HijackingHttpRequestExecutor extends HttpRequestExecutor { + + static final String HIJACKED_INPUT_ATTRIBUTE = "com.github.docker-java.hijackedInput"; + + HijackingHttpRequestExecutor(ConnectionReuseStrategy connectionReuseStrategy) { + super(connectionReuseStrategy); + } + + @Override + public ClassicHttpResponse execute( + ClassicHttpRequest request, + HttpClientConnection conn, + HttpResponseInformationCallback informationCallback, + HttpContext context + ) throws IOException, HttpException { + Objects.requireNonNull(request, "HTTP request"); + Objects.requireNonNull(conn, "Client connection"); + Objects.requireNonNull(context, "HTTP context"); + + InputStream hijackedInput = (InputStream) context.getAttribute(HIJACKED_INPUT_ATTRIBUTE); + if (hijackedInput != null) { + return executeHijacked(request, conn, context, hijackedInput); + } + + return super.execute(request, conn, informationCallback, context); + } + + private ClassicHttpResponse executeHijacked( + ClassicHttpRequest request, + HttpClientConnection conn, + HttpContext context, + InputStream hijackedInput + ) throws HttpException, IOException { + try { + context.setAttribute(HttpCoreContext.SSL_SESSION, conn.getSSLSession()); + context.setAttribute(HttpCoreContext.CONNECTION_ENDPOINT, conn.getEndpointDetails()); + final ProtocolVersion transportVersion = request.getVersion(); + if (transportVersion != null) { + context.setProtocolVersion(transportVersion); + } + + conn.sendRequestHeader(request); + conn.sendRequestEntity(request); + conn.flush(); + + ClassicHttpResponse response = conn.receiveResponseHeader(); + if (response.getCode() != HttpStatus.SC_SWITCHING_PROTOCOLS) { + conn.terminateRequest(request); + throw new ProtocolException("Expected 101 Switching Protocols, got: " + new StatusLine(response)); + } + + Thread thread = new Thread(() -> { + try { + BasicClassicHttpRequest fakeRequest = new BasicClassicHttpRequest("POST", "/"); + fakeRequest.setHeader(HttpHeaders.CONTENT_LENGTH, Long.MAX_VALUE); + fakeRequest.setEntity(new HijackedEntity(hijackedInput)); + conn.sendRequestEntity(fakeRequest); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + thread.setName("docker-java-ssh-httpclient5-hijacking-stream-" + System.identityHashCode(request)); + thread.setDaemon(true); + thread.start(); + + // 101 -> 200 + response.setCode(200); + conn.receiveResponseEntity(response); + return response; + + } catch (final HttpException | IOException | RuntimeException ex) { + Closer.closeQuietly(conn); + throw ex; + } + } + + private static class HijackedEntity extends AbstractHttpEntity { + + private final InputStream inStream; + + HijackedEntity(InputStream inStream) { + super((String) null, null, false); + this.inStream = inStream; + } + + @Override + public void writeTo(OutputStream outStream) throws IOException { + byte[] buffer = new byte[1024]; + int read; + while ((read = inStream.read(buffer)) != -1) { + outStream.write(buffer, 0, read); + outStream.flush(); + } + } + + @Override + public InputStream getContent() { + return inStream; + } + + @Override + public boolean isStreaming() { + return true; + } + + @Override + public boolean isRepeatable() { + return false; + } + + @Override + public void close() throws IOException { + inStream.close(); + } + + @Override + public long getContentLength() { + return -1; + } + } +} diff --git a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/JschDockerHttpClient.java b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/JschDockerHttpClient.java new file mode 100644 index 000000000..0edfc2c0f --- /dev/null +++ b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/JschDockerHttpClient.java @@ -0,0 +1,215 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.dromara.jpom.ssh; + +import com.github.dockerjava.transport.DockerHttpClient; +import com.jcraft.jsch.Session; +import lombok.extern.slf4j.Slf4j; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.ManagedHttpClientConnectionFactory; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.socket.ConnectionSocketFactory; +import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.config.Registry; +import org.apache.hc.core5.http.config.RegistryBuilder; +import org.apache.hc.core5.http.impl.DefaultContentLengthStrategy; +import org.apache.hc.core5.http.impl.io.EmptyInputStream; +import org.apache.hc.core5.http.io.entity.InputStreamEntity; +import org.apache.hc.core5.http.protocol.BasicHttpContext; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.net.URIAuthority; + +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * https://github.com/docker-java/docker-java + * + * @author docker-java-transport-httpclient5 + */ +@Slf4j +public final class JschDockerHttpClient implements DockerHttpClient { + + + private final Session session; + private final CloseableHttpClient httpClient; + private final HttpHost host; + + public JschDockerHttpClient(URI dockerHostUri, Supplier sessionSupplier) { + this.session = sessionSupplier.get(); + Registry socketFactoryRegistry = createConnectionSocketFactoryRegistry(session); + // + if ("ssh".equals(dockerHostUri.getScheme())) { + host = new HttpHost(dockerHostUri.getScheme(), dockerHostUri.getHost(), 2375); + } else { + host = HttpHost.create(dockerHostUri); + } + httpClient = HttpClients.custom() + .setRequestExecutor(new HijackingHttpRequestExecutor(null)) + .setConnectionManager(new PoolingHttpClientConnectionManager( + socketFactoryRegistry, + new ManagedHttpClientConnectionFactory( + null, + null, + null, + null, + message -> { + Header transferEncodingHeader = message.getFirstHeader(HttpHeaders.TRANSFER_ENCODING); + if (transferEncodingHeader != null) { + if ("identity".equalsIgnoreCase(transferEncodingHeader.getValue())) { + return ContentLengthStrategy.UNDEFINED; + } + } + return DefaultContentLengthStrategy.INSTANCE.determineLength(message); + }, + null + ) + )) + .build(); + } + + + @Override + public Response execute(Request request) { + + HttpContext context = new BasicHttpContext(); + HttpUriRequestBase httpUriRequest = new HttpUriRequestBase(request.method(), URI.create(request.path())); + httpUriRequest.setScheme(host.getSchemeName()); + httpUriRequest.setAuthority(new URIAuthority(host.getHostName(), host.getPort())); + + request.headers().forEach(httpUriRequest::addHeader); + + InputStream body = request.body(); + if (body != null) { + httpUriRequest.setEntity(new InputStreamEntity(body, null)); + } + + if (request.hijackedInput() != null) { + context.setAttribute(HijackingHttpRequestExecutor.HIJACKED_INPUT_ATTRIBUTE, request.hijackedInput()); + httpUriRequest.setHeader("Upgrade", "tcp"); + httpUriRequest.setHeader("Connection", "Upgrade"); + } + + try { + CloseableHttpResponse response = httpClient.execute(host, httpUriRequest, context); + + return new ApacheResponse(httpUriRequest, response); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() throws IOException { + try { + session.disconnect(); + } catch (Exception e) { + log.debug("session error", e); + } + httpClient.close(); + } + + @Slf4j + static class ApacheResponse implements Response { + + + private final HttpUriRequestBase request; + + private final CloseableHttpResponse response; + + ApacheResponse(HttpUriRequestBase httpUriRequest, CloseableHttpResponse response) { + this.request = httpUriRequest; + this.response = response; + } + + @Override + public int getStatusCode() { + return response.getCode(); + } + + @Override + public Map> getHeaders() { + return Stream.of(response.getHeaders()).collect(Collectors.groupingBy( + NameValuePair::getName, + Collectors.mapping(NameValuePair::getValue, Collectors.toList()) + )); + } + + @Override + public String getHeader(String name) { + Header firstHeader = response.getFirstHeader(name); + return firstHeader != null ? firstHeader.getValue() : null; + } + + @Override + public InputStream getBody() { + try { + return response.getEntity() != null + ? response.getEntity().getContent() + : EmptyInputStream.INSTANCE; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() { + try { + request.abort(); + } catch (Exception e) { + log.debug("Failed to abort the request", e); + } + + try { + response.close(); + } catch (ConnectionClosedException e) { + log.trace("Failed to close the response", e); + } catch (Exception e) { + log.debug("Failed to close the response", e); + } + } + } + + private Registry createConnectionSocketFactoryRegistry(Session session) { + RegistryBuilder socketFactoryRegistryBuilder = RegistryBuilder.create(); + return socketFactoryRegistryBuilder + .register("ssh", new PlainConnectionSocketFactory() { + @Override + public Socket createSocket(HttpContext context) throws IOException { + return new JschSocket(session); + } + }) + .build(); + } +} diff --git a/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/JschSocket.java b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/JschSocket.java new file mode 100644 index 000000000..53156b539 --- /dev/null +++ b/modules/sub-plugin/docker-cli/src/main/java/org/dromara/jpom/ssh/JschSocket.java @@ -0,0 +1,102 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.dromara.jpom.ssh; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelExec; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.net.SocketAddress; +import java.util.Optional; + +@Slf4j +class JschSocket extends Socket { + + private final Session session; + + private Channel channel; + private InputStream inputStream; + private OutputStream outputStream; + + JschSocket(Session session) { + this.session = session; + } + + @Override + public void connect(SocketAddress endpoint) throws IOException { + connect(0); + } + + @Override + public void connect(SocketAddress endpoint, int timeout) throws IOException { + connect(timeout); + } + + @Override + public boolean isConnected() { + return channel.isConnected(); + } + + @Override + public boolean isClosed() { + return channel != null && channel.isClosed(); + } + + private void connect(int timeout) throws IOException { + try { + // only 18.09 and up + channel = session.openChannel("exec"); + ((ChannelExec) channel).setCommand("docker system dial-stdio"); + log.debug("Using dialer command【docker system dial-stdio】"); + inputStream = channel.getInputStream(); + outputStream = channel.getOutputStream(); + + channel.connect(timeout); + + } catch (JSchException e) { + throw new IOException(e); + } + } + + @Override + public synchronized void close() throws IOException { + Optional.ofNullable(channel).ifPresent(Channel::disconnect); + } + + @Override + public InputStream getInputStream() { + return inputStream; + } + + @Override + public OutputStream getOutputStream() { + return outputStream; + } + +} diff --git a/modules/sub-plugin/docker-cli/src/test/java/JschDockerHttpClientIT.java b/modules/sub-plugin/docker-cli/src/test/java/JschDockerHttpClientIT.java new file mode 100644 index 000000000..84dbeac20 --- /dev/null +++ b/modules/sub-plugin/docker-cli/src/test/java/JschDockerHttpClientIT.java @@ -0,0 +1,83 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.transport.DockerHttpClient; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import org.dromara.jpom.plugins.JschLogger; +import org.dromara.jpom.ssh.JschDockerHttpClient; +import org.junit.Test; + +import java.io.IOException; + + +public class JschDockerHttpClientIT { + + @Test + public void pingViaDialer() throws IOException, JSchException { + + final JSch jSch = new JSch(); + JSch.setLogger(JschLogger.LOGGER); + +// final String configFile = System.getProperty("user.home") + File.separator + ".ssh" + File.separator + "config"; +// final File file = new File(configFile); +// if (file.exists()) { +// final OpenSSHConfig openSSHConfig = OpenSSHConfig.parseFile(file.getAbsolutePath()); +// jSch.setConfigRepository(openSSHConfig); +// } + + + final Session newSession = jSch.getSession("root", "192.168.127.156", 22); + newSession.setPassword("123456+"); + newSession.setConfig("StrictHostKeyChecking", "no"); + newSession.connect(); + + final DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withDockerHost("ssh://root@192.168.127.156") + + .build(); + + + try (final DockerHttpClient dockerHttpClient = new JschDockerHttpClient(dockerClientConfig.getDockerHost(), () -> newSession)) { + + + final DockerClient dockerClient = DockerClientImpl.getInstance(dockerClientConfig, dockerHttpClient); + + + Info exec = dockerClient.infoCmd().exec(); + System.out.println(exec); + // + exec = dockerClient.infoCmd().exec(); + System.out.println(exec); + + + dockerClient.close(); + } + } + + +} diff --git a/modules/sub-plugin/email/pom.xml b/modules/sub-plugin/email/pom.xml index 5f42ec6da..9b031f360 100644 --- a/modules/sub-plugin/email/pom.xml +++ b/modules/sub-plugin/email/pom.xml @@ -29,7 +29,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml 4.0.0 diff --git a/modules/sub-plugin/encrypt/pom.xml b/modules/sub-plugin/encrypt/pom.xml index bf7ca7d06..096d371f8 100644 --- a/modules/sub-plugin/encrypt/pom.xml +++ b/modules/sub-plugin/encrypt/pom.xml @@ -29,7 +29,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml 4.0.0 diff --git a/modules/sub-plugin/git-clone/pom.xml b/modules/sub-plugin/git-clone/pom.xml index 5e281b19a..0bb68f46b 100644 --- a/modules/sub-plugin/git-clone/pom.xml +++ b/modules/sub-plugin/git-clone/pom.xml @@ -29,7 +29,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml 4.0.0 @@ -49,10 +49,28 @@ ${project.version} + + com.github.mwiede + jsch + 0.2.9 + + + + org.bouncycastle + bcprov-jdk18on + 1.75 + + org.eclipse.jgit org.eclipse.jgit.ssh.jsch 5.13.1.202206130422-r + + + com.jcraft + jsch + + diff --git a/modules/sub-plugin/git-clone/src/main/java/org/dromara/jpom/plugin/SystemGitProcess.java b/modules/sub-plugin/git-clone/src/main/java/org/dromara/jpom/plugin/SystemGitProcess.java index a9a9d6829..3b6d04d0a 100644 --- a/modules/sub-plugin/git-clone/src/main/java/org/dromara/jpom/plugin/SystemGitProcess.java +++ b/modules/sub-plugin/git-clone/src/main/java/org/dromara/jpom/plugin/SystemGitProcess.java @@ -155,7 +155,7 @@ public class SystemGitProcess extends AbstractGitProcess { boolean needClone = this.needClone(); if (needClone) { // clone - this.reClone(printWriter); + this.reClone(printWriter, branchOrTag); } File saveFile = getSaveFile(); { @@ -180,15 +180,13 @@ public class SystemGitProcess extends AbstractGitProcess { return new String[]{commitId[0], StrUtil.EMPTY}; } - private void reClone(PrintWriter printWriter) throws IOException { + private void reClone(PrintWriter printWriter, String branchOrTag) throws IOException { printWriter.println("Automatically re-clones repositories"); // 先删除本地目录 File savePath = getSaveFile(); if (!FileUtil.clean(savePath)) { FileUtil.del(savePath.toPath()); } - // - String branchName = getBranchName(); String depthStr = Optional.ofNullable((Integer) parameter.get("depth")) .map(integer -> { if (integer > 0) { @@ -207,7 +205,7 @@ public class SystemGitProcess extends AbstractGitProcess { return null; }).ifPresent(integer -> env.put("GIT_HTTP_TIMEOUT", String.valueOf(integer))); // - String[] command = new String[]{"git", "clone", depthStr, "-b", branchName, this.getCovertUrl(), savePath.getAbsolutePath()}; + String[] command = new String[]{"git", "clone", depthStr, "-b", branchOrTag, this.getCovertUrl(), savePath.getAbsolutePath()}; FileUtil.mkdir(savePath); CommandUtil.exec(savePath, env, line -> { printWriter.println(line); diff --git a/modules/sub-plugin/pom.xml b/modules/sub-plugin/pom.xml index f3837ef5e..aab888795 100644 --- a/modules/sub-plugin/pom.xml +++ b/modules/sub-plugin/pom.xml @@ -29,7 +29,7 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml pom @@ -43,7 +43,7 @@ ssh-jsch 4.0.0 - 2.10.41 + 2.10.42.4 org.dromara.jpom.plugins jpom-plugins-parent Jpom Plugins diff --git a/modules/sub-plugin/ssh-jsch/pom.xml b/modules/sub-plugin/ssh-jsch/pom.xml index 24a924ceb..ed2f5da43 100644 --- a/modules/sub-plugin/ssh-jsch/pom.xml +++ b/modules/sub-plugin/ssh-jsch/pom.xml @@ -30,7 +30,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml plugin-ssh-jsch @@ -51,9 +51,15 @@ - com.jcraft + org.bouncycastle + bcprov-jdk18on + 1.75 + + + + com.github.mwiede jsch - 0.1.55 + 0.2.9 diff --git a/modules/sub-plugin/ssh-jsch/src/main/java/org/dromara/jpom/plugins/JschLogger.java b/modules/sub-plugin/ssh-jsch/src/main/java/org/dromara/jpom/plugins/JschLogger.java new file mode 100644 index 000000000..956964c05 --- /dev/null +++ b/modules/sub-plugin/ssh-jsch/src/main/java/org/dromara/jpom/plugins/JschLogger.java @@ -0,0 +1,78 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Code Technology Studio + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package org.dromara.jpom.plugins; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author bwcx_ + */ +@Slf4j +public class JschLogger implements com.jcraft.jsch.Logger { + + public static final JschLogger LOGGER = new JschLogger(); + + @Override + public boolean isEnabled(int level) { + switch (level) { + case DEBUG: + return log.isDebugEnabled(); + case INFO: + return log.isInfoEnabled(); + case WARN: + return log.isWarnEnabled(); + case ERROR: + case FATAL: + return log.isErrorEnabled(); + default: + log.warn("未知的 jsch 日志级别:{}", level); + return false; + } + } + + @Override + public void log(int level, String message) { + switch (level) { + case DEBUG: + // info 日志太多 记录维 debug + case INFO: + log.debug(message); + break; + case WARN: + if (StrUtil.isWrap(message, "Permanently added", "to the list of known hosts.")) { + // 避免过多日志 + log.debug(message); + } else { + log.warn(message); + } + break; + case ERROR: + case FATAL: + log.error(message); + break; + default: + log.warn("未知的 jsch 日志级别:{} {}", level, message); + } + } +} diff --git a/modules/sub-plugin/svn-clone/pom.xml b/modules/sub-plugin/svn-clone/pom.xml index ebd423713..2e454f4bc 100644 --- a/modules/sub-plugin/svn-clone/pom.xml +++ b/modules/sub-plugin/svn-clone/pom.xml @@ -29,7 +29,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml 4.0.0 @@ -53,6 +53,35 @@ org.tmatesoft.svnkit svnkit 1.10.11 + + + net.java.dev.jna + jna + + + net.java.dev.jna + jna-platform + + + com.trilead + trilead-ssh2 + + + + + com.trilead + trilead-ssh2 + 1.0.0-build222 + + + net.java.dev.jna + jna + ${jna-version} + + + net.java.dev.jna + jna-platform + ${jna-version} diff --git a/modules/sub-plugin/webhook/pom.xml b/modules/sub-plugin/webhook/pom.xml index b9f5b344b..58c736478 100644 --- a/modules/sub-plugin/webhook/pom.xml +++ b/modules/sub-plugin/webhook/pom.xml @@ -29,7 +29,7 @@ jpom-plugins-parent org.dromara.jpom.plugins - 2.10.41 + 2.10.42.4 ../pom.xml 4.0.0 diff --git a/modules/updater/pom.xml b/modules/updater/pom.xml index 843ee07a1..2c0dd9c5b 100644 --- a/modules/updater/pom.xml +++ b/modules/updater/pom.xml @@ -29,7 +29,7 @@ jpom-parent org.dromara.jpom - 2.10.41 + 2.10.42.4 ../../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index 635ef4846..95d15b6af 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.10 + 2.7.14 org.dromara.jpom @@ -50,22 +50,22 @@ 简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件 2017 - 2.10.41 + 2.10.42.4 https://gitee.com/dromara/Jpom UTF-8 1.8 2.10.0 - 2.7.10 true true - 5.8.18 - 2.0.26 - 2.0.26 + 5.8.21 + 2.0.39 + 2.0.39 + 5.12.1 diff --git a/script/replaceVersion.sh b/script/replaceVersion.sh index 68a7e8a02..a3f26ed01 100644 --- a/script/replaceVersion.sh +++ b/script/replaceVersion.sh @@ -68,6 +68,7 @@ if [[ "$tag" == "release" ]]; then sed -i.bak "s/${old_version}/${new_version}/g" "$base/modules/agent/Dockerfile" sed -i.bak "s/${old_version}/${new_version}/g" "$base/script/docker.sh" sed -i.bak "s/${old_version}/${new_version}/g" "$base/modules/server/DockerfileRelease" + sed -i.bak "s/${old_version}/${new_version}/g" "$base/modules/server/DockerfileReleaseJdk17" # vue version sed -i.bak "s/${old_version}/${new_version}/g" "$base/web-vue/package.json" # 替换 docker 中的版本 @@ -76,6 +77,7 @@ if [[ "$tag" == "release" ]]; then sed -i.bak "s/${old_version}/${new_version}/g" "$base/.workflow/MasterPipeline.yml" elif [ "$tag" == "beta" ]; then sed -i.bak "s/${old_version}/${new_version}/g" "$base/modules/server/DockerfileBeta" + sed -i.bak "s/${old_version}/${new_version}/g" "$base/modules/server/DockerfileBetaJdk17" else echo "不支持的模式 $tag" 2>&2 exit 2 diff --git a/script/tag.beta.txt b/script/tag.beta.txt index 742acc089..372dbf9ba 100644 --- a/script/tag.beta.txt +++ b/script/tag.beta.txt @@ -1 +1 @@ -2.10.41.3 +2.10.42.4 diff --git a/web-vue/.gitignore b/web-vue/.gitignore index 403adbc1e..63848b70c 100644 --- a/web-vue/.gitignore +++ b/web-vue/.gitignore @@ -21,3 +21,5 @@ pnpm-debug.log* *.njsproj *.sln *.sw? + +pnpm-lock.yaml diff --git a/web-vue/package.json b/web-vue/package.json index efa597605..cc93489df 100644 --- a/web-vue/package.json +++ b/web-vue/package.json @@ -20,7 +20,7 @@ "markdown-it-vue": "^1.1.6", "prismjs": "^1.29.0", "qrcodejs2": "^0.0.2", - "qs": "^6.9.4", + "qs": "^6.9.7", "spark-md5": "^3.0.2", "vue": "^2.6.14", "vue-clipboard2": "^0.3.3", diff --git a/web-vue/pnpm-lock.yaml b/web-vue/pnpm-lock.yaml deleted file mode 100644 index a56154677..000000000 --- a/web-vue/pnpm-lock.yaml +++ /dev/null @@ -1,10720 +0,0 @@ -lockfileVersion: '6.0' - -dependencies: - '@babel/plugin-proposal-optional-chaining': - specifier: ^7.14.5 - version: 7.14.5(@babel/core@7.21.4) - ant-design-vue: - specifier: ^1.7.8 - version: 1.7.8(vue-template-compiler@2.6.14)(vue@2.6.14) - axios: - specifier: ^0.21.1 - version: 0.21.1 - core-js: - specifier: ^3.16.0 - version: 3.16.0 - echarts: - specifier: ^4.9.0 - version: 4.9.0 - intro.js: - specifier: ^3.4.0 - version: 3.4.0 - js-sha1: - specifier: ^0.6.0 - version: 0.6.0 - jshint: - specifier: ^2.13.1 - version: 2.13.1 - markdown-it-vue: - specifier: ^1.1.6 - version: 1.1.6 - qrcodejs2: - specifier: ^0.0.2 - version: 0.0.2 - qs: - specifier: ^6.9.4 - version: 6.9.4 - spark-md5: - specifier: ^3.0.2 - version: 3.0.2 - vue: - specifier: ^2.6.14 - version: 2.6.14 - vue-clipboard2: - specifier: ^0.3.3 - version: 0.3.3 - vue-codemirror: - specifier: ^4.0.6 - version: 4.0.6 - vue-json-viewer: - specifier: ^2.2.20 - version: 2.2.20(vue@2.6.14) - vue-router: - specifier: ^3.5.2 - version: 3.5.2(vue@2.6.14) - vuedraggable: - specifier: ^2.24.3 - version: 2.24.3 - vuex: - specifier: ^3.5.1 - version: 3.5.1(vue@2.6.14) - xterm: - specifier: ^4.13.0 - version: 4.13.0 - xterm-addon-attach: - specifier: ^0.6.0 - version: 0.6.0(xterm@4.13.0) - xterm-addon-fit: - specifier: ^0.5.0 - version: 0.5.0(xterm@4.13.0) - -devDependencies: - '@vue/cli-plugin-babel': - specifier: ~4.5.13 - version: 4.5.13(@vue/cli-service@4.5.13)(core-js@3.16.0)(vue@2.6.14) - '@vue/cli-plugin-eslint': - specifier: ~4.5.13 - version: 4.5.13(@vue/cli-service@4.5.13)(eslint@6.8.0) - '@vue/cli-service': - specifier: ~4.5.13 - version: 4.5.13(less-loader@5.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14) - '@vue/eslint-config-prettier': - specifier: ^6.0.0 - version: 6.0.0(eslint-plugin-prettier@3.4.0)(eslint@6.8.0)(prettier@2.3.2) - babel-eslint: - specifier: ^10.1.0 - version: 10.1.0(eslint@6.8.0) - babel-plugin-component: - specifier: ^1.1.1 - version: 1.1.1 - babel-plugin-import: - specifier: ^1.13.3 - version: 1.13.3 - eslint: - specifier: ^6.8.0 - version: 6.8.0 - eslint-plugin-prettier: - specifier: ^3.4.0 - version: 3.4.0(eslint@6.8.0)(prettier@2.3.2) - eslint-plugin-vue: - specifier: ^7.15.1 - version: 7.15.1(eslint@6.8.0) - less: - specifier: ^3.0.4 - version: 3.0.4 - less-loader: - specifier: ^5.0.0 - version: 5.0.0(less@3.0.4)(webpack@4.46.0) - prettier: - specifier: ^2.3.2 - version: 2.3.2 - vue-template-compiler: - specifier: ^2.6.14 - version: 2.6.14 - -packages: - - /@achrinza/node-ipc@9.2.2: - resolution: {integrity: sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==} - engines: {node: 8 || 10 || 12 || 14 || 16 || 17} - dependencies: - '@node-ipc/js-queue': 2.0.3 - event-pubsub: 4.3.0 - js-message: 1.0.7 - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - - /@ant-design/colors@3.2.2: - resolution: {integrity: sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==} - dependencies: - tinycolor2: 1.6.0 - dev: false - - /@ant-design/icons-vue@2.0.0(@ant-design/icons@2.1.1)(vue-template-compiler@2.6.14)(vue@2.6.14): - resolution: {integrity: sha512-2c0QQE5hL4N48k5NkPG5sdpMl9YnvyNhf0U7YkdZYDlLnspoRU7vIA0UK9eHBs6OpFLcJB6o8eJrIl2ajBskPg==} - peerDependencies: - '@ant-design/icons': ^2.0.0 - vue: '>=2.5.0' - vue-template-compiler: '>=2.5.0' - dependencies: - '@ant-design/colors': 3.2.2 - '@ant-design/icons': 2.1.1 - babel-runtime: 6.26.0 - vue: 2.6.14 - vue-template-compiler: 2.6.14 - dev: false - - /@ant-design/icons@2.1.1: - resolution: {integrity: sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w==} - dev: false - - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - - /@babel/compat-data@7.21.4: - resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} - engines: {node: '>=6.9.0'} - - /@babel/core@7.21.4: - resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.4 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@6.1.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - - /@babel/generator@7.21.4: - resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - - /@babel/helper-annotate-as-pure@7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - dev: true - - /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: - resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.21.4 - dev: true - - /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 - lru-cache: 5.1.1 - semver: 6.3.0 - - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-regexp-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.3.2 - dev: true - - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4(supports-color@6.1.0) - lodash.debounce: 4.0.8 - resolve: 1.22.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - - /@babel/helper-explode-assignable-expression@7.18.6: - resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - dev: true - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.4 - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-member-expression-to-functions@7.21.0: - resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - dev: true - - /@babel/helper-module-imports@7.0.0-beta.35: - resolution: {integrity: sha512-vaC1KyIZSuyWb3Lj277fX0pxivyHwuDU4xZsofqgYAbkDxNieMg2vuhzP5AgMweMY7fCQUMTi+BgPqTLjkxXFg==} - dependencies: - '@babel/types': 7.0.0-beta.35 - lodash: 4.17.21 - dev: true - - /@babel/helper-module-imports@7.21.4: - resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-module-transforms@7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-simple-access': 7.20.2 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - - /@babel/helper-optimise-call-expression@7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - dev: true - - /@babel/helper-plugin-utils@7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} - engines: {node: '>=6.9.0'} - - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-replace-supers@7.20.7: - resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: - resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.21.4 - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} - engines: {node: '>=6.9.0'} - - /@babel/helper-wrap-function@7.20.5: - resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.21.0 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helpers@7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - transitivePeerDependencies: - - supports-color - - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.21.4 - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-syntax-decorators': 7.21.0(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-optional-chaining@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - dev: false - - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - dev: true - - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-decorators@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/template': 7.20.7 - dev: true - - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.4): - resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-function-name': 7.21.0 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.4): - resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.21.4): - resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.4): - resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.4): - resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-parameters@7.21.3(@babel/core@7.21.4): - resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.4): - resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - regenerator-transform: 0.15.1 - dev: true - - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-runtime@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.4): - resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - dev: true - - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-create-regexp-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/preset-env@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.21.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) - '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.4) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.4) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) - '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) - '@babel/types': 7.21.4 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) - core-js-compat: 3.30.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/preset-modules@0.1.5(@babel/core@7.21.4): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) - '@babel/types': 7.21.4 - esutils: 2.0.3 - dev: true - - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true - - /@babel/runtime@7.21.0: - resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: true - - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 - - /@babel/traverse@7.21.4: - resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.4 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.4 - '@babel/types': 7.21.4 - debug: 4.3.4(supports-color@6.1.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - /@babel/types@7.0.0-beta.35: - resolution: {integrity: sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==} - dependencies: - esutils: 2.0.3 - lodash: 4.17.21 - to-fast-properties: 2.0.0 - dev: true - - /@babel/types@7.21.4: - resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - - /@braintree/sanitize-url@3.1.0: - resolution: {integrity: sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==} - deprecated: Potential XSS vulnerability patched in v6.0.0. - dev: false - - /@hapi/address@2.1.4: - resolution: {integrity: sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==} - deprecated: Moved to 'npm install @sideway/address' - dev: true - - /@hapi/bourne@1.3.2: - resolution: {integrity: sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==} - deprecated: This version has been deprecated and is no longer supported or maintained - dev: true - - /@hapi/hoek@8.5.1: - resolution: {integrity: sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==} - deprecated: This version has been deprecated and is no longer supported or maintained - dev: true - - /@hapi/joi@15.1.1: - resolution: {integrity: sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==} - deprecated: Switch to 'npm install joi' - dependencies: - '@hapi/address': 2.1.4 - '@hapi/bourne': 1.3.2 - '@hapi/hoek': 8.5.1 - '@hapi/topo': 3.1.6 - dev: true - - /@hapi/topo@3.1.6: - resolution: {integrity: sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==} - deprecated: This version has been deprecated and is no longer supported or maintained - dependencies: - '@hapi/hoek': 8.5.1 - dev: true - - /@intervolga/optimize-cssnano-plugin@1.0.6(webpack@4.46.0): - resolution: {integrity: sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==} - peerDependencies: - webpack: ^4.0.0 - dependencies: - cssnano: 4.1.11 - cssnano-preset-default: 4.0.8 - postcss: 7.0.39 - webpack: 4.46.0 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - - /@mrmlnc/readdir-enhanced@2.2.1: - resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} - engines: {node: '>=4'} - dependencies: - call-me-maybe: 1.0.2 - glob-to-regexp: 0.3.0 - dev: true - - /@node-ipc/js-queue@2.0.3: - resolution: {integrity: sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==} - engines: {node: '>=1.0.0'} - dependencies: - easy-stack: 1.0.1 - dev: true - - /@nodelib/fs.stat@1.1.3: - resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} - engines: {node: '>= 6'} - dev: true - - /@simonwep/pickr@1.7.4: - resolution: {integrity: sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g==} - dependencies: - core-js: 3.16.0 - nanopop: 2.3.0 - dev: false - - /@soda/friendly-errors-webpack-plugin@1.8.1(webpack@4.46.0): - resolution: {integrity: sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==} - engines: {node: '>=8.0.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - chalk: 3.0.0 - error-stack-parser: 2.1.4 - string-width: 4.2.3 - strip-ansi: 6.0.1 - webpack: 4.46.0 - dev: true - - /@soda/get-current-script@1.0.2: - resolution: {integrity: sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==} - dev: true - - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - dependencies: - '@types/connect': 3.4.35 - '@types/node': 18.15.11 - dev: true - - /@types/connect-history-api-fallback@1.3.5: - resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} - dependencies: - '@types/express-serve-static-core': 4.17.33 - '@types/node': 18.15.11 - dev: true - - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - dependencies: - '@types/node': 18.15.11 - dev: true - - /@types/express-serve-static-core@4.17.33: - resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} - dependencies: - '@types/node': 18.15.11 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - dev: true - - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.33 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 - dev: true - - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.15.11 - dev: true - - /@types/http-proxy@1.17.10: - resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} - dependencies: - '@types/node': 18.15.11 - dev: true - - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: true - - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: true - - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true - - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true - - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - - /@types/q@1.5.5: - resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - dev: true - - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true - - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: true - - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} - dependencies: - '@types/mime': 3.0.1 - '@types/node': 18.15.11 - dev: true - - /@types/source-list-map@0.1.2: - resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} - dev: true - - /@types/tapable@1.0.8: - resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} - dev: true - - /@types/uglify-js@3.17.1: - resolution: {integrity: sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==} - dependencies: - source-map: 0.6.1 - dev: true - - /@types/webpack-dev-server@3.11.6(debug@4.3.4): - resolution: {integrity: sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==} - dependencies: - '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.17 - '@types/serve-static': 1.15.1 - '@types/webpack': 4.41.33 - http-proxy-middleware: 1.3.1(debug@4.3.4) - transitivePeerDependencies: - - debug - dev: true - - /@types/webpack-sources@3.2.0: - resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} - dependencies: - '@types/node': 18.15.11 - '@types/source-list-map': 0.1.2 - source-map: 0.7.4 - dev: true - - /@types/webpack@4.41.33: - resolution: {integrity: sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==} - dependencies: - '@types/node': 18.15.11 - '@types/tapable': 1.0.8 - '@types/uglify-js': 3.17.1 - '@types/webpack-sources': 3.2.0 - anymatch: 3.1.3 - source-map: 0.6.1 - dev: true - - /@vue/babel-helper-vue-jsx-merge-props@1.4.0: - resolution: {integrity: sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==} - dev: true - - /@vue/babel-helper-vue-transform-on@1.0.2: - resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} - dev: true - - /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.21.4): - resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} - dependencies: - '@babel/helper-module-imports': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - '@vue/babel-helper-vue-transform-on': 1.0.2 - camelcase: 6.3.0 - html-tags: 3.3.1 - svg-tags: 1.0.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: true - - /@vue/babel-plugin-transform-vue-jsx@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-imports': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 - html-tags: 2.0.0 - lodash.kebabcase: 4.1.1 - svg-tags: 1.0.0 - dev: true - - /@vue/babel-preset-app@4.5.19(@babel/core@7.21.4)(core-js@3.16.0)(vue@2.6.14): - resolution: {integrity: sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==} - peerDependencies: - '@babel/core': '*' - core-js: ^3 - vue: ^2 || ^3.0.0-0 - peerDependenciesMeta: - core-js: - optional: true - vue: - optional: true - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) - '@babel/helper-module-imports': 7.21.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) - '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.21.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-transform-runtime': 7.21.4(@babel/core@7.21.4) - '@babel/preset-env': 7.21.4(@babel/core@7.21.4) - '@babel/runtime': 7.21.0 - '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.21.4) - '@vue/babel-preset-jsx': 1.4.0(@babel/core@7.21.4)(vue@2.6.14) - babel-plugin-dynamic-import-node: 2.3.3 - core-js: 3.16.0 - core-js-compat: 3.30.1 - semver: 6.3.0 - vue: 2.6.14 - transitivePeerDependencies: - - supports-color - dev: true - - /@vue/babel-preset-jsx@1.4.0(@babel/core@7.21.4)(vue@2.6.14): - resolution: {integrity: sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - vue: '*' - peerDependenciesMeta: - vue: - optional: true - dependencies: - '@babel/core': 7.21.4 - '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 - '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.21.4) - '@vue/babel-sugar-composition-api-inject-h': 1.4.0(@babel/core@7.21.4) - '@vue/babel-sugar-composition-api-render-instance': 1.4.0(@babel/core@7.21.4) - '@vue/babel-sugar-functional-vue': 1.4.0(@babel/core@7.21.4) - '@vue/babel-sugar-inject-h': 1.4.0(@babel/core@7.21.4) - '@vue/babel-sugar-v-model': 1.4.0(@babel/core@7.21.4) - '@vue/babel-sugar-v-on': 1.4.0(@babel/core@7.21.4) - vue: 2.6.14 - dev: true - - /@vue/babel-sugar-composition-api-inject-h@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - dev: true - - /@vue/babel-sugar-composition-api-render-instance@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - dev: true - - /@vue/babel-sugar-functional-vue@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - dev: true - - /@vue/babel-sugar-inject-h@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - dev: true - - /@vue/babel-sugar-v-model@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 - '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.21.4) - camelcase: 5.3.1 - html-tags: 2.0.0 - svg-tags: 1.0.0 - dev: true - - /@vue/babel-sugar-v-on@1.4.0(@babel/core@7.21.4): - resolution: {integrity: sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.21.4) - camelcase: 5.3.1 - dev: true - - /@vue/cli-overlay@4.5.19: - resolution: {integrity: sha512-GdxvNSmOw7NHIazCO8gTK+xZbaOmScTtxj6eHVeMbYpDYVPJ+th3VMLWNpw/b6uOjwzzcyKlA5dRQ1DAb+gF/g==} - dev: true - - /@vue/cli-plugin-babel@4.5.13(@vue/cli-service@4.5.13)(core-js@3.16.0)(vue@2.6.14): - resolution: {integrity: sha512-ykvEAfD8PgGs+dGMGqr7l/nRmIS39NRzWLhMluPLTvDV1L+IxcoB73HNLGA/aENDpl8CuWrTE+1VgydcOhp+wg==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@vue/babel-preset-app': 4.5.19(@babel/core@7.21.4)(core-js@3.16.0)(vue@2.6.14) - '@vue/cli-service': 4.5.13(less-loader@5.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14) - '@vue/cli-shared-utils': 4.5.19 - babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@4.46.0) - cache-loader: 4.1.0(webpack@4.46.0) - thread-loader: 2.1.3(webpack@4.46.0) - webpack: 4.46.0 - transitivePeerDependencies: - - core-js - - supports-color - - vue - - webpack-cli - - webpack-command - dev: true - - /@vue/cli-plugin-eslint@4.5.13(@vue/cli-service@4.5.13)(eslint@6.8.0): - resolution: {integrity: sha512-yc2uXX6aBiy3vEf5TwaueaDqQbdIXIhk0x0KzEtpPo23jBdLkpOSoU5NCgE06g/ZiGAcettpmBSv73Hfp4wHEw==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0-0 - eslint: '>= 1.6.0 < 7.0.0' - dependencies: - '@vue/cli-service': 4.5.13(less-loader@5.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14) - '@vue/cli-shared-utils': 4.5.19 - eslint: 6.8.0 - eslint-loader: 2.2.1(eslint@6.8.0)(webpack@4.46.0) - globby: 9.2.0 - inquirer: 7.3.3 - webpack: 4.46.0 - yorkie: 2.0.0 - transitivePeerDependencies: - - supports-color - - webpack-cli - - webpack-command - dev: true - - /@vue/cli-plugin-router@4.5.19(@vue/cli-service@4.5.13): - resolution: {integrity: sha512-3icGzH1IbVYmMMsOwYa0lal/gtvZLebFXdE5hcQJo2mnTwngXGMTyYAzL56EgHBPjbMmRpyj6Iw9k4aVInVX6A==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0-0 - dependencies: - '@vue/cli-service': 4.5.13(less-loader@5.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14) - '@vue/cli-shared-utils': 4.5.19 - dev: true - - /@vue/cli-plugin-vuex@4.5.19(@vue/cli-service@4.5.13): - resolution: {integrity: sha512-DUmfdkG3pCdkP7Iznd87RfE9Qm42mgp2hcrNcYQYSru1W1gX2dG/JcW8bxmeGSa06lsxi9LEIc/QD1yPajSCZw==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0-0 - dependencies: - '@vue/cli-service': 4.5.13(less-loader@5.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14) - dev: true - - /@vue/cli-service@4.5.13(less-loader@5.0.0)(vue-template-compiler@2.6.14)(vue@2.6.14): - resolution: {integrity: sha512-CKAZN4iokMMsaUyJRU22oUAz3oS/X9sVBSKAF2/shFBV5xh3jqAlKl8OXZYz4cXGFLA6djNuYrniuLAo7Ku97A==} - engines: {node: '>=8'} - hasBin: true - peerDependencies: - '@vue/compiler-sfc': ^3.0.0-beta.14 - less-loader: '*' - pug-plain-loader: '*' - raw-loader: '*' - sass-loader: '*' - stylus-loader: '*' - vue-template-compiler: ^2.0.0 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - less-loader: - optional: true - pug-plain-loader: - optional: true - raw-loader: - optional: true - sass-loader: - optional: true - stylus-loader: - optional: true - vue-template-compiler: - optional: true - dependencies: - '@intervolga/optimize-cssnano-plugin': 1.0.6(webpack@4.46.0) - '@soda/friendly-errors-webpack-plugin': 1.8.1(webpack@4.46.0) - '@soda/get-current-script': 1.0.2 - '@types/minimist': 1.2.2 - '@types/webpack': 4.41.33 - '@types/webpack-dev-server': 3.11.6(debug@4.3.4) - '@vue/cli-overlay': 4.5.19 - '@vue/cli-plugin-router': 4.5.19(@vue/cli-service@4.5.13) - '@vue/cli-plugin-vuex': 4.5.19(@vue/cli-service@4.5.13) - '@vue/cli-shared-utils': 4.5.19 - '@vue/component-compiler-utils': 3.3.0 - '@vue/preload-webpack-plugin': 1.1.2(html-webpack-plugin@3.2.0)(webpack@4.46.0) - '@vue/web-component-wrapper': 1.3.0 - acorn: 7.4.1 - acorn-walk: 7.2.0 - address: 1.2.2 - autoprefixer: 9.8.8 - browserslist: 4.21.5 - cache-loader: 4.1.0(webpack@4.46.0) - case-sensitive-paths-webpack-plugin: 2.4.0 - cli-highlight: 2.1.11 - clipboardy: 2.3.0 - cliui: 6.0.0 - copy-webpack-plugin: 5.1.2(webpack@4.46.0) - css-loader: 3.6.0(webpack@4.46.0) - cssnano: 4.1.11 - debug: 4.3.4(supports-color@6.1.0) - default-gateway: 5.0.5 - dotenv: 8.6.0 - dotenv-expand: 5.1.0 - file-loader: 4.3.0(webpack@4.46.0) - fs-extra: 7.0.1 - globby: 9.2.0 - hash-sum: 2.0.0 - html-webpack-plugin: 3.2.0(webpack@4.46.0) - launch-editor-middleware: 2.6.0 - less-loader: 5.0.0(less@3.0.4)(webpack@4.46.0) - lodash.defaultsdeep: 4.6.1 - lodash.mapvalues: 4.6.0 - lodash.transform: 4.6.0 - mini-css-extract-plugin: 0.9.0(webpack@4.46.0) - minimist: 1.2.8 - pnp-webpack-plugin: 1.7.0 - portfinder: 1.0.32(supports-color@6.1.0) - postcss-loader: 3.0.0 - ssri: 8.0.1 - terser-webpack-plugin: 1.4.5(webpack@4.46.0) - thread-loader: 2.1.3(webpack@4.46.0) - url-loader: 2.3.0(file-loader@4.3.0)(webpack@4.46.0) - vue-loader: 15.10.1(cache-loader@4.1.0)(css-loader@3.6.0)(vue-template-compiler@2.6.14)(webpack@4.46.0) - vue-style-loader: 4.1.3 - vue-template-compiler: 2.6.14 - webpack: 4.46.0 - webpack-bundle-analyzer: 3.9.0 - webpack-chain: 6.5.1 - webpack-dev-server: 3.11.3(webpack@4.46.0) - webpack-merge: 4.2.2 - optionalDependencies: - vue-loader-v16: /vue-loader@16.8.3(vue@2.6.14)(webpack@4.46.0) - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - bufferutil - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - supports-color - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - typescript - - underscore - - utf-8-validate - - vash - - velocityjs - - vue - - walrus - - webpack-cli - - webpack-command - - whiskers - dev: true - - /@vue/cli-shared-utils@4.5.19: - resolution: {integrity: sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==} - dependencies: - '@achrinza/node-ipc': 9.2.2 - '@hapi/joi': 15.1.1 - chalk: 2.4.2 - execa: 1.0.0 - launch-editor: 2.6.0 - lru-cache: 5.1.1 - open: 6.4.0 - ora: 3.4.0 - read-pkg: 5.2.0 - request: 2.88.2 - semver: 6.3.0 - strip-ansi: 6.0.1 - dev: true - - /@vue/component-compiler-utils@3.3.0: - resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} - dependencies: - consolidate: 0.15.1 - hash-sum: 1.0.2 - lru-cache: 4.1.5 - merge-source-map: 1.1.0 - postcss: 7.0.39 - postcss-selector-parser: 6.0.11 - source-map: 0.6.1 - vue-template-es2015-compiler: 1.9.1 - optionalDependencies: - prettier: 2.3.2 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - dev: true - - /@vue/eslint-config-prettier@6.0.0(eslint-plugin-prettier@3.4.0)(eslint@6.8.0)(prettier@2.3.2): - resolution: {integrity: sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ==} - peerDependencies: - eslint: '>= 5.0.0' - eslint-plugin-prettier: ^3.1.0 - prettier: '>= 1.13.0' - dependencies: - eslint: 6.8.0 - eslint-config-prettier: 6.15.0(eslint@6.8.0) - eslint-plugin-prettier: 3.4.0(eslint@6.8.0)(prettier@2.3.2) - prettier: 2.3.2 - dev: true - - /@vue/preload-webpack-plugin@1.1.2(html-webpack-plugin@3.2.0)(webpack@4.46.0): - resolution: {integrity: sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==} - engines: {node: '>=6.0.0'} - peerDependencies: - html-webpack-plugin: '>=2.26.0' - webpack: '>=4.0.0' - dependencies: - html-webpack-plugin: 3.2.0(webpack@4.46.0) - webpack: 4.46.0 - dev: true - - /@vue/web-component-wrapper@1.3.0: - resolution: {integrity: sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==} - dev: true - - /@webassemblyjs/ast@1.9.0: - resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} - dependencies: - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.9.0: - resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} - dev: true - - /@webassemblyjs/helper-api-error@1.9.0: - resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} - dev: true - - /@webassemblyjs/helper-buffer@1.9.0: - resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} - dev: true - - /@webassemblyjs/helper-code-frame@1.9.0: - resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} - dependencies: - '@webassemblyjs/wast-printer': 1.9.0 - dev: true - - /@webassemblyjs/helper-fsm@1.9.0: - resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} - dev: true - - /@webassemblyjs/helper-module-context@1.9.0: - resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.9.0: - resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.9.0: - resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - dev: true - - /@webassemblyjs/ieee754@1.9.0: - resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.9.0: - resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.9.0: - resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} - dev: true - - /@webassemblyjs/wasm-edit@1.9.0: - resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/helper-wasm-section': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - '@webassemblyjs/wasm-opt': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - '@webassemblyjs/wast-printer': 1.9.0 - dev: true - - /@webassemblyjs/wasm-gen@1.9.0: - resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/ieee754': 1.9.0 - '@webassemblyjs/leb128': 1.9.0 - '@webassemblyjs/utf8': 1.9.0 - dev: true - - /@webassemblyjs/wasm-opt@1.9.0: - resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - dev: true - - /@webassemblyjs/wasm-parser@1.9.0: - resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-api-error': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/ieee754': 1.9.0 - '@webassemblyjs/leb128': 1.9.0 - '@webassemblyjs/utf8': 1.9.0 - dev: true - - /@webassemblyjs/wast-parser@1.9.0: - resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/floating-point-hex-parser': 1.9.0 - '@webassemblyjs/helper-api-error': 1.9.0 - '@webassemblyjs/helper-code-frame': 1.9.0 - '@webassemblyjs/helper-fsm': 1.9.0 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/wast-printer@1.9.0: - resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-jsx@5.3.2(acorn@7.4.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 7.4.1 - dev: true - - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@6.4.2: - resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /add-dom-event-listener@1.1.0: - resolution: {integrity: sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==} - dependencies: - object-assign: 4.1.1 - dev: false - - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - dev: true - - /ajv-errors@1.0.1(ajv@6.12.6): - resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} - peerDependencies: - ajv: '>=5.0.0' - dependencies: - ajv: 6.12.6 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /alphanum-sort@1.0.2: - resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} - dev: true - - /ansi-colors@3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: true - - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ant-design-vue@1.7.8(vue-template-compiler@2.6.14)(vue@2.6.14): - resolution: {integrity: sha512-F1hmiS9vwbyfuFvlamdW5l9bHKqRlj9wHaGDIE41NZMWXyWy8qL0UFa/+I0Wl8gQWZCqODW5pN6Yfoyn85At3A==} - requiresBuild: true - peerDependencies: - vue: ^2.6.0 - vue-template-compiler: ^2.6.0 - dependencies: - '@ant-design/icons': 2.1.1 - '@ant-design/icons-vue': 2.0.0(@ant-design/icons@2.1.1)(vue-template-compiler@2.6.14)(vue@2.6.14) - '@simonwep/pickr': 1.7.4 - add-dom-event-listener: 1.1.0 - array-tree-filter: 2.1.0 - async-validator: 3.5.2 - babel-helper-vue-jsx-merge-props: 2.0.3 - babel-runtime: 6.26.0 - classnames: 2.3.2 - component-classes: 1.2.6 - dom-align: 1.12.4 - dom-closest: 0.2.0 - dom-scroll-into-view: 2.0.1 - enquire.js: 2.1.6 - intersperse: 1.0.0 - is-mobile: 2.2.2 - is-negative-zero: 2.0.2 - ismobilejs: 1.1.1 - json2mq: 0.2.0 - lodash: 4.17.21 - moment: 2.29.4 - mutationobserver-shim: 0.3.7 - node-emoji: 1.11.0 - omit.js: 1.0.2 - raf: 3.4.1 - resize-observer-polyfill: 1.5.1 - shallow-equal: 1.2.1 - shallowequal: 1.1.0 - vue: 2.6.14 - vue-ref: 2.0.0 - vue-template-compiler: 2.6.14 - warning: 4.0.3 - dev: false - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch@2.0.0(supports-color@6.1.0): - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - dependencies: - micromatch: 3.1.10(supports-color@6.1.0) - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: true - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false - - /arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - dev: true - - /arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: true - - /arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: true - - /array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - dev: false - - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - dev: true - - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - dev: true - - /array.prototype.reduce@1.0.5: - resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true - optional: true - - /asciimath-to-latex@0.3.2: - resolution: {integrity: sha512-+80CDzm6nXdtsYwUdxBOLo7FA6ZO5CfRyYHgqLpUZgavPYqodXHamOQuLZJksV+4CUteJs1h7cBaF63d2qa97Q==} - dev: false - - /asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - dev: true - - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - dev: true - - /assert@1.5.0: - resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} - dependencies: - object-assign: 4.1.1 - util: 0.10.3 - dev: true - - /assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - dev: true - - /astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - dev: true - - /async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - dev: true - - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: true - - /async-validator@3.5.2: - resolution: {integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==} - dev: false - - /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - dependencies: - lodash: 4.17.21 - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: true - - /autoprefixer@9.8.8: - resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} - hasBin: true - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001478 - normalize-range: 0.1.2 - num2fraction: 1.2.2 - picocolors: 0.2.1 - postcss: 7.0.39 - postcss-value-parser: 4.2.0 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - dev: true - - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - dev: true - - /axios@0.21.1: - resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} - dependencies: - follow-redirects: 1.15.2(debug@4.3.4) - transitivePeerDependencies: - - debug - dev: false - - /babel-eslint@10.1.0(eslint@6.8.0): - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.4 - '@babel/traverse': 7.21.4 - '@babel/types': 7.21.4 - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - resolve: 1.22.3 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-helper-vue-jsx-merge-props@2.0.3: - resolution: {integrity: sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==} - dev: false - - /babel-loader@8.3.0(@babel/core@7.21.4)(webpack@4.46.0): - resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.21.4 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 4.46.0 - dev: true - - /babel-plugin-component@1.1.1: - resolution: {integrity: sha512-WUw887kJf2GH80Ng/ZMctKZ511iamHNqPhd9uKo14yzisvV7Wt1EckIrb8oq/uCz3B3PpAW7Xfl7AkTLDYT6ag==} - dependencies: - '@babel/helper-module-imports': 7.0.0-beta.35 - dev: true - - /babel-plugin-dynamic-import-node@2.3.3: - resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} - dependencies: - object.assign: 4.1.4 - dev: true - - /babel-plugin-import@1.13.3: - resolution: {integrity: sha512-1qCWdljJOrDRH/ybaCZuDgySii4yYrtQ8OJQwrcDqdt0y67N30ng3X3nABg6j7gR7qUJgcMa9OMhc4AGViDwWw==} - dependencies: - '@babel/helper-module-imports': 7.21.4 - '@babel/runtime': 7.21.0 - dev: true - - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.4 - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - core-js-compat: 3.30.1 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - dev: true - - /babel-runtime@6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.0 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - dev: true - - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true - - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - dev: true - - /bfj@6.1.2: - resolution: {integrity: sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==} - engines: {node: '>= 6.0.0'} - dependencies: - bluebird: 3.7.2 - check-types: 8.0.3 - hoopy: 0.1.4 - tryer: 1.0.1 - dev: true - - /big.js@3.2.0: - resolution: {integrity: sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==} - dev: true - - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true - - /binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - optional: true - - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: true - optional: true - - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true - - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: true - - /body-parser@1.20.1(supports-color@6.1.0): - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9(supports-color@6.1.0) - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour@3.5.0: - resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} - dependencies: - array-flatten: 2.1.2 - deep-equal: 1.1.1 - dns-equal: 1.0.0 - dns-txt: 2.0.2 - multicast-dns: 6.2.3 - multicast-dns-service-types: 1.1.0 - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces@2.3.2(supports-color@6.1.0): - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2(supports-color@6.1.0) - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true - - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - dev: true - - /browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - dependencies: - cipher-base: 1.0.4 - des.js: 1.0.1 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /browserify-rsa@4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - dependencies: - bn.js: 5.2.1 - randombytes: 2.1.0 - dev: true - - /browserify-sign@4.2.1: - resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} - dependencies: - bn.js: 5.2.1 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.5.4 - inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: true - - /browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - dependencies: - pako: 1.0.11 - dev: true - - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001478 - electron-to-chromium: 1.4.365 - node-releases: 2.0.10 - update-browserslist-db: 1.0.11(browserslist@4.21.5) - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer-indexof@1.1.1: - resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} - dev: true - - /buffer-json@2.0.0: - resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} - dev: true - - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: true - - /buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - dev: true - - /builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - dev: true - - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true - - /cacache@12.0.4: - resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - figgy-pudding: 3.5.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - infer-owner: 1.0.4 - lru-cache: 5.1.1 - mississippi: 3.0.0 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 2.7.1 - ssri: 6.0.2 - unique-filename: 1.1.1 - y18n: 4.0.3 - dev: true - - /cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.0 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - dev: true - - /cache-loader@4.1.0(webpack@4.46.0): - resolution: {integrity: sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 - dependencies: - buffer-json: 2.0.0 - find-cache-dir: 3.3.2 - loader-utils: 1.4.2 - mkdirp: 0.5.6 - neo-async: 2.6.2 - schema-utils: 2.7.1 - webpack: 4.46.0 - dev: true - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 - dev: true - - /call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - dev: true - - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 - dev: true - - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 - dev: true - - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001478 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - dev: true - - /caniuse-lite@1.0.30001478: - resolution: {integrity: sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==} - - /case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - dev: true - - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true - - /check-types@8.0.3: - resolution: {integrity: sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==} - dev: true - - /chokidar@2.1.8(supports-color@6.1.0): - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies - dependencies: - anymatch: 2.0.0(supports-color@6.1.0) - async-each: 1.0.6 - braces: 2.3.2(supports-color@6.1.0) - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1(supports-color@6.1.0) - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - requiresBuild: true - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - optional: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - dev: true - - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - dev: true - - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: false - - /clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} - dependencies: - source-map: 0.6.1 - dev: true - - /cli-cursor@2.1.0: - resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} - engines: {node: '>=4'} - dependencies: - restore-cursor: 2.0.0 - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - dev: true - - /cli-spinners@2.8.0: - resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} - engines: {node: '>=6'} - dev: true - - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - - /cli@1.0.1: - resolution: {integrity: sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==} - engines: {node: '>=0.2.5'} - dependencies: - exit: 0.1.2 - glob: 7.2.3 - dev: false - - /clipboard@2.0.11: - resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} - dependencies: - good-listener: 1.2.2 - select: 1.1.2 - tiny-emitter: 2.1.0 - dev: false - - /clipboardy@2.3.0: - resolution: {integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==} - engines: {node: '>=8'} - dependencies: - arch: 2.2.0 - execa: 1.0.0 - is-wsl: 2.2.0 - dev: true - - /cliui@5.0.0: - resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - dev: true - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - /coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} - dependencies: - '@types/q': 1.5.5 - chalk: 2.4.2 - q: 1.5.1 - dev: true - - /codemirror@5.65.12: - resolution: {integrity: sha512-z2jlHBocElRnPYysN2HAuhXbO3DNB0bcSKmNz3hcWR2Js2Dkhc1bEOxG93Z3DeUrnm+qx56XOY5wQmbP5KY0sw==} - dev: false - - /collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: true - - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander@2.17.1: - resolution: {integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==} - dev: true - - /commander@2.19.0: - resolution: {integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==} - dev: true - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - - /component-classes@1.2.6: - resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==} - dependencies: - component-indexof: 0.0.3 - dev: false - - /component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: true - - /component-indexof@0.0.3: - resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==} - dev: false - - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4(supports-color@6.1.0): - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9(supports-color@6.1.0) - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - dev: true - - /connect-history-api-fallback@1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} - dev: true - - /console-browserify@1.1.0: - resolution: {integrity: sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==} - dependencies: - date-now: 0.1.4 - dev: false - - /console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - dev: true - - /consolidate@0.15.1: - resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} - engines: {node: '>= 0.10.0'} - peerDependencies: - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - babel-core: ^6.26.3 - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jade: ^1.11.0 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - marko: ^3.14.4 - mote: ^0.2.0 - mustache: ^3.0.0 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - razor-tmpl: ^1.3.1 - react: ^16.13.1 - react-dom: ^16.13.1 - slm: ^2.0.0 - squirrelly: ^5.1.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-jade: '*' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - arc-templates: - optional: true - atpl: - optional: true - babel-core: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jade: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - marko: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - razor-tmpl: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - squirrelly: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-jade: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true - dependencies: - bluebird: 3.7.2 - dev: true - - /constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - dev: true - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /copy-concurrently@1.0.5: - resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} - dependencies: - aproba: 1.2.0 - fs-write-stream-atomic: 1.0.10 - iferr: 0.1.5 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: true - - /copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - dev: true - - /copy-webpack-plugin@5.1.2(webpack@4.46.0): - resolution: {integrity: sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - cacache: 12.0.4 - find-cache-dir: 2.1.0 - glob-parent: 3.1.0 - globby: 7.1.1 - is-glob: 4.0.3 - loader-utils: 1.4.2 - minimatch: 3.1.2 - normalize-path: 3.0.0 - p-limit: 2.3.0 - schema-utils: 1.0.0 - serialize-javascript: 4.0.0 - webpack: 4.46.0 - webpack-log: 2.0.0 - dev: true - - /core-js-compat@3.30.1: - resolution: {integrity: sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==} - dependencies: - browserslist: 4.21.5 - dev: true - - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false - - /core-js@3.16.0: - resolution: {integrity: sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 - dev: true - - /create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - dependencies: - bn.js: 4.12.0 - elliptic: 6.5.4 - dev: true - - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - dev: true - - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /crypto-browserify@3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.1 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - inherits: 2.0.4 - pbkdf2: 3.1.2 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - dev: true - - /css-color-names@0.0.4: - resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - dev: true - - /css-declaration-sorter@4.0.1: - resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} - engines: {node: '>4'} - dependencies: - postcss: 7.0.39 - timsort: 0.3.0 - dev: true - - /css-loader@3.6.0(webpack@4.46.0): - resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - camelcase: 5.3.1 - cssesc: 3.0.0 - icss-utils: 4.1.1 - loader-utils: 1.4.2 - normalize-path: 3.0.0 - postcss: 7.0.39 - postcss-modules-extract-imports: 2.0.0 - postcss-modules-local-by-default: 3.0.3 - postcss-modules-scope: 2.2.0 - postcss-modules-values: 3.0.0 - postcss-value-parser: 4.2.0 - schema-utils: 2.7.1 - semver: 6.3.0 - webpack: 4.46.0 - dev: true - - /css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: true - - /css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 - dev: true - - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: true - - /css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 - dev: true - - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: true - - /css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /cssnano-preset-default@4.0.8: - resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} - engines: {node: '>=6.9.0'} - dependencies: - css-declaration-sorter: 4.0.1 - cssnano-util-raw-cache: 4.0.1 - postcss: 7.0.39 - postcss-calc: 7.0.5 - postcss-colormin: 4.0.3 - postcss-convert-values: 4.0.1 - postcss-discard-comments: 4.0.2 - postcss-discard-duplicates: 4.0.2 - postcss-discard-empty: 4.0.1 - postcss-discard-overridden: 4.0.1 - postcss-merge-longhand: 4.0.11 - postcss-merge-rules: 4.0.3 - postcss-minify-font-values: 4.0.2 - postcss-minify-gradients: 4.0.2 - postcss-minify-params: 4.0.2 - postcss-minify-selectors: 4.0.2 - postcss-normalize-charset: 4.0.1 - postcss-normalize-display-values: 4.0.2 - postcss-normalize-positions: 4.0.2 - postcss-normalize-repeat-style: 4.0.2 - postcss-normalize-string: 4.0.2 - postcss-normalize-timing-functions: 4.0.2 - postcss-normalize-unicode: 4.0.1 - postcss-normalize-url: 4.0.1 - postcss-normalize-whitespace: 4.0.2 - postcss-ordered-values: 4.1.2 - postcss-reduce-initial: 4.0.3 - postcss-reduce-transforms: 4.0.2 - postcss-svgo: 4.0.3 - postcss-unique-selectors: 4.0.1 - dev: true - - /cssnano-util-get-arguments@4.0.0: - resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} - engines: {node: '>=6.9.0'} - dev: true - - /cssnano-util-get-match@4.0.0: - resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} - engines: {node: '>=6.9.0'} - dev: true - - /cssnano-util-raw-cache@4.0.1: - resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: true - - /cssnano-util-same-parent@4.0.1: - resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} - engines: {node: '>=6.9.0'} - dev: true - - /cssnano@4.1.11: - resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} - engines: {node: '>=6.9.0'} - dependencies: - cosmiconfig: 5.2.1 - cssnano-preset-default: 4.0.8 - is-resolvable: 1.1.0 - postcss: 7.0.39 - dev: true - - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - dependencies: - css-tree: 1.1.3 - dev: true - - /cyclist@1.0.1: - resolution: {integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==} - dev: true - - /d3-array@1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} - dev: false - - /d3-array@3.2.3: - resolution: {integrity: sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==} - engines: {node: '>=12'} - dependencies: - internmap: 2.0.3 - dev: false - - /d3-axis@1.0.12: - resolution: {integrity: sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==} - dev: false - - /d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - dev: false - - /d3-brush@1.1.6: - resolution: {integrity: sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==} - dependencies: - d3-dispatch: 1.0.6 - d3-drag: 1.2.5 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-transition: 1.3.2 - dev: false - - /d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - - /d3-chord@1.0.6: - resolution: {integrity: sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==} - dependencies: - d3-array: 1.2.4 - d3-path: 1.0.9 - dev: false - - /d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false - - /d3-collection@1.0.7: - resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} - dev: false - - /d3-color@1.4.1: - resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} - dev: false - - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false - - /d3-contour@1.3.2: - resolution: {integrity: sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==} - dependencies: - d3-array: 1.2.4 - dev: false - - /d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.3 - dev: false - - /d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - dependencies: - delaunator: 5.0.0 - dev: false - - /d3-dispatch@1.0.6: - resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} - dev: false - - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false - - /d3-drag@1.2.5: - resolution: {integrity: sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==} - dependencies: - d3-dispatch: 1.0.6 - d3-selection: 1.4.2 - dev: false - - /d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - dev: false - - /d3-dsv@1.2.0: - resolution: {integrity: sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==} - hasBin: true - dependencies: - commander: 2.20.3 - iconv-lite: 0.4.24 - rw: 1.3.3 - dev: false - - /d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - dev: false - - /d3-ease@1.0.7: - resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} - dev: false - - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false - - /d3-fetch@1.2.0: - resolution: {integrity: sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==} - dependencies: - d3-dsv: 1.2.0 - dev: false - - /d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - dependencies: - d3-dsv: 3.0.1 - dev: false - - /d3-force@1.2.1: - resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} - dependencies: - d3-collection: 1.0.7 - d3-dispatch: 1.0.6 - d3-quadtree: 1.0.7 - d3-timer: 1.0.10 - dev: false - - /d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - dev: false - - /d3-format@1.4.5: - resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} - dev: false - - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false - - /d3-geo@1.12.1: - resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} - dependencies: - d3-array: 1.2.4 - dev: false - - /d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.3 - dev: false - - /d3-hierarchy@1.1.9: - resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} - dev: false - - /d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - dev: false - - /d3-interpolate@1.4.0: - resolution: {integrity: sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==} - dependencies: - d3-color: 1.4.1 - dev: false - - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - dev: false - - /d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false - - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false - - /d3-polygon@1.0.6: - resolution: {integrity: sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==} - dev: false - - /d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - dev: false - - /d3-quadtree@1.0.7: - resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} - dev: false - - /d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - dev: false - - /d3-random@1.1.2: - resolution: {integrity: sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==} - dev: false - - /d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - dev: false - - /d3-scale-chromatic@1.5.0: - resolution: {integrity: sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==} - dependencies: - d3-color: 1.4.1 - d3-interpolate: 1.4.0 - dev: false - - /d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - dev: false - - /d3-scale@2.2.2: - resolution: {integrity: sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==} - dependencies: - d3-array: 1.2.4 - d3-collection: 1.0.7 - d3-format: 1.4.5 - d3-interpolate: 1.4.0 - d3-time: 1.1.0 - d3-time-format: 2.3.0 - dev: false - - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.3 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - dev: false - - /d3-selection@1.4.2: - resolution: {integrity: sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==} - dev: false - - /d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - dev: false - - /d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - dependencies: - d3-path: 1.0.9 - dev: false - - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false - - /d3-time-format@2.3.0: - resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} - dependencies: - d3-time: 1.1.0 - dev: false - - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - dependencies: - d3-time: 3.1.0 - dev: false - - /d3-time@1.1.0: - resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} - dev: false - - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.3 - dev: false - - /d3-timer@1.0.10: - resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} - dev: false - - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false - - /d3-transition@1.3.2: - resolution: {integrity: sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==} - dependencies: - d3-color: 1.4.1 - d3-dispatch: 1.0.6 - d3-ease: 1.0.7 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-timer: 1.0.10 - dev: false - - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - dev: false - - /d3-voronoi@1.1.4: - resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} - dev: false - - /d3-zoom@1.8.3: - resolution: {integrity: sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==} - dependencies: - d3-dispatch: 1.0.6 - d3-drag: 1.2.5 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-transition: 1.3.2 - dev: false - - /d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - - /d3@5.16.0: - resolution: {integrity: sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==} - dependencies: - d3-array: 1.2.4 - d3-axis: 1.0.12 - d3-brush: 1.1.6 - d3-chord: 1.0.6 - d3-collection: 1.0.7 - d3-color: 1.4.1 - d3-contour: 1.3.2 - d3-dispatch: 1.0.6 - d3-drag: 1.2.5 - d3-dsv: 1.2.0 - d3-ease: 1.0.7 - d3-fetch: 1.2.0 - d3-force: 1.2.1 - d3-format: 1.4.5 - d3-geo: 1.12.1 - d3-hierarchy: 1.1.9 - d3-interpolate: 1.4.0 - d3-path: 1.0.9 - d3-polygon: 1.0.6 - d3-quadtree: 1.0.7 - d3-random: 1.1.2 - d3-scale: 2.2.2 - d3-scale-chromatic: 1.5.0 - d3-selection: 1.4.2 - d3-shape: 1.3.7 - d3-time: 1.1.0 - d3-time-format: 2.3.0 - d3-timer: 1.0.10 - d3-transition: 1.3.2 - d3-voronoi: 1.1.4 - d3-zoom: 1.8.3 - dev: false - - /d3@7.8.4: - resolution: {integrity: sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.3 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.0 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.0.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - dev: false - - /dagre-d3@0.6.4: - resolution: {integrity: sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==} - dependencies: - d3: 5.16.0 - dagre: 0.8.5 - graphlib: 2.1.8 - lodash: 4.17.21 - dev: false - - /dagre@0.8.5: - resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} - dependencies: - graphlib: 2.1.8 - lodash: 4.17.21 - dev: false - - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - - /date-now@0.1.4: - resolution: {integrity: sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==} - dev: false - - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - /debug@2.6.9(supports-color@6.1.0): - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - supports-color: 6.1.0 - dev: true - - /debug@3.2.7(supports-color@6.1.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 6.1.0 - dev: true - - /debug@4.3.4(supports-color@6.1.0): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 6.1.0 - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: true - - /deep-equal@1.1.1: - resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} - dependencies: - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object-keys: 1.1.1 - regexp.prototype.flags: 1.4.3 - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepmerge@1.5.2: - resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==} - engines: {node: '>=0.10.0'} - dev: true - - /default-gateway@4.2.0: - resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} - engines: {node: '>=6'} - dependencies: - execa: 1.0.0 - ip-regex: 2.1.0 - dev: true - - /default-gateway@5.0.5: - resolution: {integrity: sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==} - engines: {node: ^8.12.0 || >=9.7.0} - dependencies: - execa: 3.4.0 - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 0.1.6 - dev: true - - /define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.2 - dev: true - - /define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.2 - isobject: 3.0.1 - dev: true - - /del@4.1.1: - resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} - engines: {node: '>=6'} - dependencies: - '@types/glob': 7.2.0 - globby: 6.1.0 - is-path-cwd: 2.2.0 - is-path-in-cwd: 2.1.0 - p-map: 2.1.0 - pify: 4.0.1 - rimraf: 2.7.1 - dev: true - - /delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} - dependencies: - robust-predicates: 3.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /delegate@3.2.0: - resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} - dev: false - - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /des.js@1.0.1: - resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true - - /diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dev: false - - /diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dependencies: - bn.js: 4.12.0 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - dev: true - - /dir-glob@2.2.2: - resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} - engines: {node: '>=4'} - dependencies: - path-type: 3.0.0 - dev: true - - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true - - /dns-packet@1.3.4: - resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} - dependencies: - ip: 1.1.8 - safe-buffer: 5.2.1 - dev: true - - /dns-txt@2.0.2: - resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} - dependencies: - buffer-indexof: 1.1.1 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dom-align@1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - dev: false - - /dom-closest@0.2.0: - resolution: {integrity: sha512-6neTn1BtJlTSt+XSISXpnOsF1uni1CHsP/tmzZMGWxasYFHsBOqrHPnzmneqEgKhpagnfnfSfbvRRW0xFsBHAA==} - dependencies: - dom-matches: 2.0.0 - dev: false - - /dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - dependencies: - utila: 0.4.0 - dev: true - - /dom-matches@2.0.0: - resolution: {integrity: sha512-2VI856xEDCLXi19W+4BechR5/oIS6bKCKqcf16GR8Pg7dGLJ/eBOWVbCmQx2ISvYH6wTNx5Ef7JTOw1dRGRx6A==} - dev: false - - /dom-scroll-into-view@2.0.1: - resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} - dev: false - - /dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true - - /domain-browser@1.2.0: - resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} - engines: {node: '>=0.4', npm: '>=1.2'} - dev: true - - /domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - /domhandler@2.3.0: - resolution: {integrity: sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==} - dependencies: - domelementtype: 1.3.1 - dev: false - - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /dompurify@2.3.5: - resolution: {integrity: sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==} - dev: false - - /domutils@1.5.1: - resolution: {integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==} - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dev: false - - /domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dev: true - - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: true - - /dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} - dev: true - - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.1 - dev: true - - /easy-stack@1.0.1: - resolution: {integrity: sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==} - engines: {node: '>=6.0.0'} - dev: true - - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - - /echarts@4.9.0: - resolution: {integrity: sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==} - dependencies: - zrender: 4.3.2 - dev: false - - /echarts@5.4.2: - resolution: {integrity: sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==} - dependencies: - tslib: 2.3.0 - zrender: 5.4.3 - dev: false - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - - /ejs@2.7.4: - resolution: {integrity: sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dev: true - - /electron-to-chromium@1.4.365: - resolution: {integrity: sha512-FRHZO+1tUNO4TOPXmlxetkoaIY8uwHzd1kKopK/Gx2SKn1L47wJXWD44wxP5CGRyyP98z/c8e1eBzJrgPeiBOg==} - - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emojis-list@2.1.0: - resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} - engines: {node: '>= 0.10'} - dev: true - - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true - - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /enhanced-resolve@4.5.0: - resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} - engines: {node: '>=6.9.0'} - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.5.0 - tapable: 1.1.3 - dev: true - - /enquire.js@2.1.6: - resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==} - dev: false - - /entities@1.0.0: - resolution: {integrity: sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==} - dev: false - - /entities@2.1.0: - resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - dev: false - - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - dependencies: - prr: 1.0.1 - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 - dev: true - - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: true - - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /eslint-config-prettier@6.15.0(eslint@6.8.0): - resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} - hasBin: true - peerDependencies: - eslint: '>=3.14.1' - dependencies: - eslint: 6.8.0 - get-stdin: 6.0.0 - dev: true - - /eslint-loader@2.2.1(eslint@6.8.0)(webpack@4.46.0): - resolution: {integrity: sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==} - deprecated: This loader has been deprecated. Please use eslint-webpack-plugin - peerDependencies: - eslint: '>=1.6.0 <7.0.0' - webpack: '>=2.0.0 <5.0.0' - dependencies: - eslint: 6.8.0 - loader-fs-cache: 1.0.3 - loader-utils: 1.4.2 - object-assign: 4.1.1 - object-hash: 1.3.1 - rimraf: 2.7.1 - webpack: 4.46.0 - dev: true - - /eslint-plugin-prettier@3.4.0(eslint@6.8.0)(prettier@2.3.2): - resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} - engines: {node: '>=6.0.0'} - peerDependencies: - eslint: '>=5.0.0' - eslint-config-prettier: '*' - prettier: '>=1.13.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint: 6.8.0 - prettier: 2.3.2 - prettier-linter-helpers: 1.0.0 - dev: true - - /eslint-plugin-vue@7.15.1(eslint@6.8.0): - resolution: {integrity: sha512-4/r+n/i+ovyeW2gVRRH92kpy4lkpFbyPR4BMxGBTLtGnwqOKKzjSo6EMSaT0RhWPvEjK9uifcY8e7z5n8BIEgw==} - engines: {node: '>=8.10'} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 - dependencies: - eslint: 6.8.0 - eslint-utils: 2.1.0 - natural-compare: 1.4.0 - semver: 6.3.0 - vue-eslint-parser: 7.11.0(eslint@6.8.0) - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-scope@4.0.3: - resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} - engines: {node: '>=4.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-utils@1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - - /eslint@6.8.0: - resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - hasBin: true - dependencies: - '@babel/code-frame': 7.21.4 - ajv: 6.12.6 - chalk: 2.4.2 - cross-spawn: 6.0.5 - debug: 4.3.4(supports-color@6.1.0) - doctrine: 3.0.0 - eslint-scope: 5.1.1 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.5.0 - esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 12.4.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - inquirer: 7.3.3 - is-glob: 4.0.3 - js-yaml: 3.14.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.21 - minimatch: 3.1.2 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.0 - strip-ansi: 5.2.0 - strip-json-comments: 3.1.1 - table: 5.4.6 - text-table: 0.2.0 - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true - - /eve-raphael@0.5.0: - resolution: {integrity: sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug==} - dev: false - - /event-pubsub@4.3.0: - resolution: {integrity: sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==} - engines: {node: '>=4.0.0'} - dev: true - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /eventsource@2.0.2: - resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} - engines: {node: '>=12.0.0'} - dev: true - - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - dev: true - - /execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - - /execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - - /execa@3.4.0: - resolution: {integrity: sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==} - engines: {node: ^8.12.0 || >=9.7.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - p-finally: 2.0.1 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: false - - /expand-brackets@2.1.4(supports-color@6.1.0): - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - dependencies: - debug: 2.6.9(supports-color@6.1.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /express@4.18.2(supports-color@6.1.0): - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1(supports-color@6.1.0) - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9(supports-color@6.1.0) - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0(supports-color@6.1.0) - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0(supports-color@6.1.0) - serve-static: 1.15.0(supports-color@6.1.0) - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: true - - /extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - - /extglob@2.0.4(supports-color@6.1.0): - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@6.1.0) - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fast-glob@2.2.7: - resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} - engines: {node: '>=4.0.0'} - dependencies: - '@mrmlnc/readdir-enhanced': 2.2.1 - '@nodelib/fs.stat': 1.1.3 - glob-parent: 3.1.0 - is-glob: 4.0.3 - merge2: 1.4.1 - micromatch: 3.1.10(supports-color@6.1.0) - transitivePeerDependencies: - - supports-color - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: true - - /figgy-pudding@3.5.2: - resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /file-entry-cache@5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - dependencies: - flat-cache: 2.0.1 - dev: true - - /file-loader@4.3.0(webpack@4.46.0): - resolution: {integrity: sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^4.0.0 - dependencies: - loader-utils: 1.4.2 - schema-utils: 2.7.1 - webpack: 4.46.0 - dev: true - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: true - optional: true - - /filesize@3.6.1: - resolution: {integrity: sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==} - engines: {node: '>= 0.4.0'} - dev: true - - /fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler@1.2.0(supports-color@6.1.0): - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9(supports-color@6.1.0) - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-cache-dir@0.1.1: - resolution: {integrity: sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==} - engines: {node: '>=0.10.0'} - dependencies: - commondir: 1.0.1 - mkdirp: 0.5.6 - pkg-dir: 1.0.0 - dev: true - - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - dev: true - - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: true - - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - dependencies: - flatted: 2.0.2 - rimraf: 2.6.3 - write: 1.0.3 - dev: true - - /flatted@2.0.2: - resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - dev: true - - /flowchart.js@1.17.1: - resolution: {integrity: sha512-zphTaxdyqvHHu+8Cdf6HvamhArXpq9SyNe1zQ61maCIfTenaj3cMvjS1e/0gfPj7QTLTx3HroSzVqDXpL8naoQ==} - engines: {node: '>=4.0.0'} - dependencies: - raphael: 2.3.0 - dev: false - - /flush-write-stream@1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /follow-redirects@1.15.2(debug@4.3.4): - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4(supports-color@6.1.0) - - /font-awesome-icon-chars@2.6.0: - resolution: {integrity: sha512-AIPi+GRxTn2e2MhIVfKcO/HhDdbqZZEiWOojyqVyU6lUEU7sCYaMJlEYG4dvhLBss6JKcjsV5R8RIAEMOvG8NQ==} - dev: false - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: true - - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - dev: true - - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true - - /fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - dependencies: - map-cache: 0.2.2 - dev: true - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-write-stream-atomic@1.0.10: - resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} - dependencies: - graceful-fs: 4.2.11 - iferr: 0.1.5 - imurmurhash: 0.1.4 - readable-stream: 2.3.8 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.17.0 - dev: true - optional: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 - dev: true - - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - - /get-stdin@6.0.0: - resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} - engines: {node: '>=4'} - dev: true - - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: true - - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - dev: true - - /get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - dev: true - - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - dependencies: - assert-plus: 1.0.0 - dev: true - - /github-markdown-css@4.0.0: - resolution: {integrity: sha512-mH0bcIKv4XAN0mQVokfTdKo2OD5K8WJE9+lbMdM32/q0Ie5tXgVN/2o+zvToRMxSTUuiTRcLg5hzkFfOyBYreg==} - dev: false - - /glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.3.0: - resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - /globals@12.4.0: - resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.8.1 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - dev: true - - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - - /globby@7.1.1: - resolution: {integrity: sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==} - engines: {node: '>=4'} - dependencies: - array-union: 1.0.2 - dir-glob: 2.2.2 - glob: 7.2.3 - ignore: 3.3.10 - pify: 3.0.0 - slash: 1.0.0 - dev: true - - /globby@9.2.0: - resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} - engines: {node: '>=6'} - dependencies: - '@types/glob': 7.2.0 - array-union: 1.0.2 - dir-glob: 2.2.2 - fast-glob: 2.2.7 - glob: 7.2.3 - ignore: 4.0.6 - pify: 4.0.1 - slash: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /good-listener@1.2.2: - resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} - dependencies: - delegate: 3.2.0 - dev: false - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.0 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /graphlib@2.1.8: - resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} - dependencies: - lodash: 4.17.21 - dev: false - - /gzip-size@5.1.1: - resolution: {integrity: sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==} - engines: {node: '>=6'} - dependencies: - duplexer: 0.1.2 - pify: 4.0.1 - dev: true - - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true - - /har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - dev: true - - /har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.0 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - dev: true - - /has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - dev: true - - /has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - dev: true - - /has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: true - - /hash-sum@1.0.2: - resolution: {integrity: sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==} - dev: true - - /hash-sum@2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - dev: true - - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - /hex-color-regex@1.1.0: - resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} - dev: true - - /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /hoopy@0.1.4: - resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} - engines: {node: '>= 6.0.0'} - dev: true - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - dev: true - - /hsl-regex@1.0.0: - resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} - dev: true - - /hsla-regex@1.0.0: - resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} - dev: true - - /html-entities@1.4.0: - resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} - dev: true - - /html-minifier@3.5.21: - resolution: {integrity: sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==} - engines: {node: '>=4'} - hasBin: true - dependencies: - camel-case: 3.0.0 - clean-css: 4.2.4 - commander: 2.17.1 - he: 1.2.0 - param-case: 2.1.1 - relateurl: 0.2.7 - uglify-js: 3.4.10 - dev: true - - /html-tags@2.0.0: - resolution: {integrity: sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==} - engines: {node: '>=4'} - dev: true - - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - dev: true - - /html-webpack-plugin@3.2.0(webpack@4.46.0): - resolution: {integrity: sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==} - engines: {node: '>=6.9'} - deprecated: 3.x is no longer supported - peerDependencies: - webpack: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - html-minifier: 3.5.21 - loader-utils: 0.2.17 - lodash: 4.17.21 - pretty-error: 2.1.2 - tapable: 1.1.3 - toposort: 1.0.7 - util.promisify: 1.0.0 - webpack: 4.46.0 - dev: true - - /htmlparser2@3.8.3: - resolution: {integrity: sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==} - dependencies: - domelementtype: 1.3.1 - domhandler: 2.3.0 - domutils: 1.5.1 - entities: 1.0.0 - readable-stream: 1.1.14 - dev: false - - /htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - dev: true - - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true - - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: true - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true - - /http-proxy-middleware@0.19.1(debug@4.3.4)(supports-color@6.1.0): - resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} - engines: {node: '>=4.0.0'} - dependencies: - http-proxy: 1.18.1(debug@4.3.4) - is-glob: 4.0.3 - lodash: 4.17.21 - micromatch: 3.1.10(supports-color@6.1.0) - transitivePeerDependencies: - - debug - - supports-color - dev: true - - /http-proxy-middleware@1.3.1(debug@4.3.4): - resolution: {integrity: sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==} - engines: {node: '>=8.0.0'} - dependencies: - '@types/http-proxy': 1.17.10 - http-proxy: 1.18.1(debug@4.3.4) - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.5 - transitivePeerDependencies: - - debug - dev: true - - /http-proxy@1.18.1(debug@4.3.4): - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.2(debug@4.3.4) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - - /http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.17.0 - dev: true - - /https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - dev: true - - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - - /icss-utils@4.1.1: - resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} - engines: {node: '>= 6'} - dependencies: - postcss: 7.0.39 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /iferr@0.1.5: - resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} - dev: true - - /ignore@3.3.10: - resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} - dev: true - - /ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - dev: true - - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /import-cwd@2.1.0: - resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} - engines: {node: '>=4'} - dependencies: - import-from: 2.1.0 - dev: true - - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-from@2.1.0: - resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} - engines: {node: '>=4'} - dependencies: - resolve-from: 3.0.0 - dev: true - - /import-local@2.0.0: - resolution: {integrity: sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - pkg-dir: 3.0.0 - resolve-cwd: 2.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indexes-of@1.0.1: - resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} - dev: true - - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.1: - resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} - dev: true - - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - dev: true - - /internal-ip@4.3.0: - resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} - engines: {node: '>=6'} - dependencies: - default-gateway: 4.2.0 - ipaddr.js: 1.9.1 - dev: true - - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false - - /intersperse@1.0.0: - resolution: {integrity: sha512-LGcfug7OTeWkaQ8PEq8XbTy9Jl6uCNg8DrPnQUmwxSY8UETj1Y+LLmpdD0qHdEj6KVchuH3BE3ZzIXQ1t3oFUw==} - dev: false - - /intro.js@3.4.0: - resolution: {integrity: sha512-LlOM5izNtkPEtjusCYDZs6Nt9JrykpUuqWh5bfQJtWVMWtg2vGzxzJDGrTdF9XUzVZvWzVIdkga/M/z8AX6hlg==} - dev: false - - /ip-regex@2.1.0: - resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} - engines: {node: '>=4'} - dev: true - - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: true - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true - - /is-absolute-url@2.1.0: - resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - dev: true - - /is-accessor-descriptor@0.1.6: - resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /is-accessor-descriptor@1.0.0: - resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 6.0.3 - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - dependencies: - binary-extensions: 1.13.1 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - optional: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - dependencies: - ci-info: 1.6.0 - dev: true - - /is-color-stop@1.1.0: - resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} - dependencies: - css-color-names: 0.0.4 - hex-color-regex: 1.1.0 - hsl-regex: 1.0.0 - hsla-regex: 1.0.0 - rgb-regex: 1.0.1 - rgba-regex: 1.0.0 - dev: true - - /is-core-module@2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} - dependencies: - has: 1.0.3 - dev: true - - /is-data-descriptor@0.1.4: - resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /is-data-descriptor@1.0.0: - resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 6.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-descriptor@0.1.6: - resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} - engines: {node: '>=0.10.0'} - dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 - dev: true - - /is-descriptor@1.0.2: - resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} - engines: {node: '>=0.10.0'} - dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.3 - dev: true - - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: true - - /is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-object: 2.0.4 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-mobile@2.2.2: - resolution: {integrity: sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==} - dev: false - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true - - /is-path-in-cwd@2.1.0: - resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} - engines: {node: '>=6'} - dependencies: - is-path-inside: 2.1.0 - dev: true - - /is-path-inside@2.1.0: - resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} - engines: {node: '>=6'} - dependencies: - path-is-inside: 1.0.2 - dev: true - - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: true - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-resolvable@1.1.0: - resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /ismobilejs@1.1.1: - resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} - dev: false - - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - dependencies: - isarray: 1.0.0 - dev: true - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - dev: true - - /javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - dev: true - - /js-message@1.0.7: - resolution: {integrity: sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==} - engines: {node: '>=0.6.0'} - dev: true - - /js-sha1@0.6.0: - resolution: {integrity: sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==} - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - dev: true - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - /jshint@2.13.1: - resolution: {integrity: sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==} - hasBin: true - dependencies: - cli: 1.0.1 - console-browserify: 1.1.0 - exit: 0.1.2 - htmlparser2: 3.8.3 - lodash: 4.17.21 - minimatch: 3.0.8 - shelljs: 0.3.0 - strip-json-comments: 1.0.4 - dev: false - - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /json2mq@0.2.0: - resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} - dependencies: - string-convert: 0.2.1 - dev: false - - /json5@0.5.1: - resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} - hasBin: true - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - - /katex@0.6.0: - resolution: {integrity: sha512-rS4mY3SvHYg5LtQV6RBcK0if7ur6plyEukAOV+jGGPqFImuzu8fHL6M752iBmRGoUyF0bhZbAPoezehn7xYksA==} - hasBin: true - dependencies: - match-at: 0.1.1 - dev: false - - /katex@0.9.0: - resolution: {integrity: sha512-lp3x90LT1tDZBW2tjLheJ98wmRMRjUHwk4QpaswT9bhqoQZ+XA4cPcjcQBxgOQNwaOSt6ZeL/a6GKQ1of3LFxQ==} - hasBin: true - dependencies: - match-at: 0.1.1 - dev: false - - /khroma@1.4.1: - resolution: {integrity: sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==} - dev: false - - /killable@1.0.1: - resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} - dev: true - - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: true - - /kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: true - - /kind-of@5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /launch-editor-middleware@2.6.0: - resolution: {integrity: sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==} - dependencies: - launch-editor: 2.6.0 - dev: true - - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} - dependencies: - picocolors: 1.0.0 - shell-quote: 1.8.1 - dev: true - - /less-loader@5.0.0(less@3.0.4)(webpack@4.46.0): - resolution: {integrity: sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==} - engines: {node: '>= 4.8.0'} - peerDependencies: - less: ^2.3.1 || ^3.0.0 - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - clone: 2.1.2 - less: 3.0.4 - loader-utils: 1.4.2 - pify: 4.0.1 - webpack: 4.46.0 - dev: true - - /less@3.0.4: - resolution: {integrity: sha512-q3SyEnPKbk9zh4l36PGeW2fgynKu+FpbhiUNx/yaiBUQ3V0CbACCgb9FzYWcRgI2DJlP6eI4jc8XPrCTi55YcQ==} - engines: {node: '>=4'} - hasBin: true - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - mime: 1.6.0 - mkdirp: 0.5.6 - promise: 7.3.1 - request: 2.88.2 - source-map: 0.6.1 - dev: true - - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - dependencies: - uc.micro: 1.0.6 - dev: false - - /loader-fs-cache@1.0.3: - resolution: {integrity: sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==} - dependencies: - find-cache-dir: 0.1.1 - mkdirp: 0.5.6 - dev: true - - /loader-runner@2.4.0: - resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - dev: true - - /loader-utils@0.2.17: - resolution: {integrity: sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==} - dependencies: - big.js: 3.2.0 - emojis-list: 2.1.0 - json5: 0.5.1 - object-assign: 4.1.1 - dev: true - - /loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - dev: true - - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - dev: true - - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true - - /lodash.defaultsdeep@4.6.1: - resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} - dev: true - - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true - - /lodash.mapvalues@4.6.0: - resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} - dev: true - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.transform@4.6.0: - resolution: {integrity: sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==} - dev: true - - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} - dependencies: - chalk: 2.4.2 - dev: true - - /loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} - engines: {node: '>= 0.6.0'} - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - dev: true - - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.1 - dev: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - dependencies: - object-visit: 1.0.1 - dev: true - - /markdown-it-abbr@1.0.4: - resolution: {integrity: sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==} - dev: false - - /markdown-it-container@3.0.0: - resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==} - dev: false - - /markdown-it-deflist@2.1.0: - resolution: {integrity: sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==} - dev: false - - /markdown-it-emoji@2.0.2: - resolution: {integrity: sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==} - dev: false - - /markdown-it-footnote@3.0.3: - resolution: {integrity: sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==} - dev: false - - /markdown-it-github-toc@3.2.4: - resolution: {integrity: sha512-2zgUxrvD3vw90eBtOodU5D47rLF6STtrzlZhct2bFeJpEtmXIEpmFyGkuZmfzVc5NYKB+cbrp3GjHyPCTXBjwQ==} - dependencies: - uslug: 1.0.4 - dev: false - - /markdown-it-ins@3.0.1: - resolution: {integrity: sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==} - dev: false - - /markdown-it-katex@2.0.3: - resolution: {integrity: sha512-nUkkMtRWeg7OpdflamflE/Ho/pWl64Lk9wNBKOmaj33XkQdumhXAIYhI0WO03GeiycPCsxbmX536V5NEXpC3Ng==} - dependencies: - katex: 0.6.0 - dev: false - - /markdown-it-latex@0.2.0: - resolution: {integrity: sha512-vCaS6Dws9faA8lZel7Slfa1IYEnbYOjHzian/tDBulONBS+f9vRkFfQ4S0eFnTGtDTTXqE7zAnoezkv18b9IIA==} - dependencies: - asciimath-to-latex: 0.3.2 - katex: 0.9.0 - dev: false - - /markdown-it-mark@3.0.1: - resolution: {integrity: sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==} - dev: false - - /markdown-it-regex@0.2.0: - resolution: {integrity: sha512-111UnMGJSt37gy+DlgcpQNwEfS2jvscOFSztzGhuXUHk7K1J5eAEj6C3jifmKb0cWtTuxdpHgIt4PyGQ+DtDjw==} - dev: false - - /markdown-it-source-map@0.1.1: - resolution: {integrity: sha512-q4+ij82K/0C6O8rw/NnWogcgp3AeQykZZ5954yyxY8pcX8Rago8uAS7e+4Ogd6rERf/tDAen73KwT+Sb7dP/6w==} - dev: false - - /markdown-it-sub@1.0.0: - resolution: {integrity: sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==} - dev: false - - /markdown-it-sup@1.0.0: - resolution: {integrity: sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==} - dev: false - - /markdown-it-task-lists@2.1.1: - resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} - dev: false - - /markdown-it-toc-and-anchor@4.2.0: - resolution: {integrity: sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==} - dependencies: - clone: 2.1.2 - uslug: 1.0.4 - dev: false - - /markdown-it-vue@1.1.6: - resolution: {integrity: sha512-Y2bOI4G6Fo1BZFGeWc29VJv4BrgfkUbfKtlDDqq9EOOpIrD1PH/Ums03zniqEVFneIwAFjPxwkGfuwUrRYaiGA==} - dependencies: - echarts: 5.4.2 - flowchart.js: 1.17.1 - font-awesome-icon-chars: 2.6.0 - github-markdown-css: 4.0.0 - highlight.js: 10.7.3 - markdown-it: 12.3.2 - markdown-it-abbr: 1.0.4 - markdown-it-container: 3.0.0 - markdown-it-deflist: 2.1.0 - markdown-it-emoji: 2.0.2 - markdown-it-footnote: 3.0.3 - markdown-it-github-toc: 3.2.4 - markdown-it-ins: 3.0.1 - markdown-it-katex: 2.0.3 - markdown-it-latex: 0.2.0 - markdown-it-mark: 3.0.1 - markdown-it-regex: 0.2.0 - markdown-it-source-map: 0.1.1 - markdown-it-sub: 1.0.0 - markdown-it-sup: 1.0.0 - markdown-it-task-lists: 2.1.1 - markdown-it-toc-and-anchor: 4.2.0 - mermaid: 8.14.0 - vue: 2.6.14 - dev: false - - /markdown-it@12.3.2: - resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} - hasBin: true - dependencies: - argparse: 2.0.1 - entities: 2.1.0 - linkify-it: 3.0.3 - mdurl: 1.0.1 - uc.micro: 1.0.6 - dev: false - - /match-at@0.1.1: - resolution: {integrity: sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q==} - dev: false - - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: true - - /mdn-data@2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - dev: true - - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - dev: false - - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /memory-fs@0.4.1: - resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: true - - /memory-fs@0.5.0: - resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: true - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - - /merge-source-map@1.1.0: - resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} - dependencies: - source-map: 0.6.1 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /mermaid@8.14.0: - resolution: {integrity: sha512-ITSHjwVaby1Li738sxhF48sLTxcNyUAoWfoqyztL1f7J6JOLpHOuQPNLBb6lxGPUA0u7xP9IRULgvod0dKu35A==} - dependencies: - '@braintree/sanitize-url': 3.1.0 - d3: 7.8.4 - dagre: 0.8.5 - dagre-d3: 0.6.4 - dompurify: 2.3.5 - graphlib: 2.1.8 - khroma: 1.4.1 - moment-mini: 2.29.4 - stylis: 4.1.3 - dev: false - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - - /micromatch@3.1.10(supports-color@6.1.0): - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2(supports-color@6.1.0) - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@6.1.0) - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@6.1.0) - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - - /mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mini-css-extract-plugin@0.9.0(webpack@4.46.0): - resolution: {integrity: sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.4.0 - dependencies: - loader-utils: 1.4.2 - normalize-url: 1.9.1 - schema-utils: 1.0.0 - webpack: 4.46.0 - webpack-sources: 1.4.3 - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true - - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true - - /mississippi@3.0.0: - resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} - engines: {node: '>=4.0.0'} - dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.4 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 3.0.0 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - dev: true - - /mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - dev: true - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /moment-mini@2.29.4: - resolution: {integrity: sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==} - dev: false - - /moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - dev: false - - /move-concurrently@1.0.1: - resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} - dependencies: - aproba: 1.2.0 - copy-concurrently: 1.0.5 - fs-write-stream-atomic: 1.0.10 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /multicast-dns-service-types@1.1.0: - resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} - dev: true - - /multicast-dns@6.2.3: - resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} - hasBin: true - dependencies: - dns-packet: 1.3.4 - thunky: 1.1.0 - dev: true - - /mutationobserver-shim@0.3.7: - resolution: {integrity: sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ==} - dev: false - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - - /nan@2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} - dev: true - optional: true - - /nanomatch@1.2.13(supports-color@6.1.0): - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@6.1.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /nanopop@2.3.0: - resolution: {integrity: sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - - /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - dependencies: - lower-case: 1.1.4 - dev: true - - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - dependencies: - lodash: 4.17.21 - dev: false - - /node-forge@0.10.0: - resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} - engines: {node: '>= 6.0.0'} - dev: true - - /node-libs-browser@2.2.1: - resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} - dependencies: - assert: 1.5.0 - browserify-zlib: 0.2.0 - buffer: 4.9.2 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - crypto-browserify: 3.12.0 - domain-browser: 1.2.0 - events: 3.3.0 - https-browserify: 1.0.0 - os-browserify: 0.3.0 - path-browserify: 0.0.1 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 2.3.8 - stream-browserify: 2.0.2 - stream-http: 2.8.3 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.0 - url: 0.11.0 - util: 0.11.1 - vm-browserify: 1.1.2 - dev: true - - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.3 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@1.0.0: - resolution: {integrity: sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - dependencies: - remove-trailing-separator: 1.1.0 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@1.9.1: - resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==} - engines: {node: '>=4'} - dependencies: - object-assign: 4.1.1 - prepend-http: 1.0.4 - query-string: 4.3.4 - sort-keys: 1.1.2 - dev: true - - /normalize-url@3.3.0: - resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} - engines: {node: '>=6'} - dev: true - - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /nth-check@1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} - dependencies: - boolbase: 1.0.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /num2fraction@1.2.2: - resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} - dev: true - - /oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - /object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - dev: true - - /object-hash@1.3.1: - resolution: {integrity: sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==} - engines: {node: '>= 0.10.0'} - dev: true - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.getownpropertydescriptors@2.1.5: - resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} - engines: {node: '>= 0.8'} - dependencies: - array.prototype.reduce: 1.0.5 - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true - - /omit.js@1.0.2: - resolution: {integrity: sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==} - dependencies: - babel-runtime: 6.26.0 - dev: false - - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} - dependencies: - mimic-fn: 1.2.0 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /open@6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} - dependencies: - is-wsl: 1.1.0 - dev: true - - /opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - dev: true - - /opn@5.5.0: - resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} - engines: {node: '>=4'} - dependencies: - is-wsl: 1.1.0 - dev: true - - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - - /ora@3.4.0: - resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} - engines: {node: '>=6'} - dependencies: - chalk: 2.4.2 - cli-cursor: 2.1.0 - cli-spinners: 2.8.0 - log-symbols: 2.2.0 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 - dev: true - - /os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - - /p-finally@2.0.1: - resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} - engines: {node: '>=8'} - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true - - /p-retry@3.0.1: - resolution: {integrity: sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==} - engines: {node: '>=6'} - dependencies: - retry: 0.12.0 - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - - /parallel-transform@1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} - dependencies: - cyclist: 1.0.1 - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - dependencies: - no-case: 2.3.2 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} - dependencies: - asn1.js: 5.4.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.2 - safe-buffer: 5.2.1 - dev: true - - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.21.4 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - dependencies: - parse5: 6.0.1 - dev: true - - /parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: true - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - dev: true - - /path-browserify@0.0.1: - resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} - dev: true - - /path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - dev: true - - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie-promise: 2.0.1 - dev: true - - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - - /picocolors@0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true - - /pkg-dir@1.0.0: - resolution: {integrity: sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==} - engines: {node: '>=0.10.0'} - dependencies: - find-up: 1.1.2 - dev: true - - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /pnp-webpack-plugin@1.7.0: - resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} - engines: {node: '>=6'} - dependencies: - ts-pnp: 1.2.0 - transitivePeerDependencies: - - typescript - dev: true - - /portfinder@1.0.32(supports-color@6.1.0): - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} - dependencies: - async: 2.6.4 - debug: 3.2.7(supports-color@6.1.0) - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - dev: true - - /postcss-calc@7.0.5: - resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} - dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-colormin@4.0.3: - resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.5 - color: 3.2.1 - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-convert-values@4.0.1: - resolution: {integrity: sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-discard-comments@4.0.2: - resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: true - - /postcss-discard-duplicates@4.0.2: - resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: true - - /postcss-discard-empty@4.0.1: - resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: true - - /postcss-discard-overridden@4.0.1: - resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: true - - /postcss-load-config@2.1.2: - resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} - engines: {node: '>= 4'} - dependencies: - cosmiconfig: 5.2.1 - import-cwd: 2.1.0 - dev: true - - /postcss-loader@3.0.0: - resolution: {integrity: sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==} - engines: {node: '>= 6'} - dependencies: - loader-utils: 1.4.2 - postcss: 7.0.39 - postcss-load-config: 2.1.2 - schema-utils: 1.0.0 - dev: true - - /postcss-merge-longhand@4.0.11: - resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} - engines: {node: '>=6.9.0'} - dependencies: - css-color-names: 0.0.4 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - stylehacks: 4.0.3 - dev: true - - /postcss-merge-rules@4.0.3: - resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.5 - caniuse-api: 3.0.0 - cssnano-util-same-parent: 4.0.1 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 - vendors: 1.0.4 - dev: true - - /postcss-minify-font-values@4.0.2: - resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-minify-gradients@4.0.2: - resolution: {integrity: sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-arguments: 4.0.0 - is-color-stop: 1.1.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-minify-params@4.0.2: - resolution: {integrity: sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==} - engines: {node: '>=6.9.0'} - dependencies: - alphanum-sort: 1.0.2 - browserslist: 4.21.5 - cssnano-util-get-arguments: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - uniqs: 2.0.0 - dev: true - - /postcss-minify-selectors@4.0.2: - resolution: {integrity: sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==} - engines: {node: '>=6.9.0'} - dependencies: - alphanum-sort: 1.0.2 - has: 1.0.3 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 - dev: true - - /postcss-modules-extract-imports@2.0.0: - resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} - engines: {node: '>= 6'} - dependencies: - postcss: 7.0.39 - dev: true - - /postcss-modules-local-by-default@3.0.3: - resolution: {integrity: sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==} - engines: {node: '>= 6'} - dependencies: - icss-utils: 4.1.1 - postcss: 7.0.39 - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-modules-scope@2.2.0: - resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} - engines: {node: '>= 6'} - dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.0.11 - dev: true - - /postcss-modules-values@3.0.0: - resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} - dependencies: - icss-utils: 4.1.1 - postcss: 7.0.39 - dev: true - - /postcss-normalize-charset@4.0.1: - resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - dev: true - - /postcss-normalize-display-values@4.0.2: - resolution: {integrity: sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-match: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-positions@4.0.2: - resolution: {integrity: sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-arguments: 4.0.0 - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-repeat-style@4.0.2: - resolution: {integrity: sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-arguments: 4.0.0 - cssnano-util-get-match: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-string@4.0.2: - resolution: {integrity: sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==} - engines: {node: '>=6.9.0'} - dependencies: - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-timing-functions@4.0.2: - resolution: {integrity: sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-match: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-unicode@4.0.1: - resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.5 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-url@4.0.1: - resolution: {integrity: sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==} - engines: {node: '>=6.9.0'} - dependencies: - is-absolute-url: 2.1.0 - normalize-url: 3.3.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-normalize-whitespace@4.0.2: - resolution: {integrity: sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-ordered-values@4.1.2: - resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-arguments: 4.0.0 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-reduce-initial@4.0.3: - resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.5 - caniuse-api: 3.0.0 - has: 1.0.3 - postcss: 7.0.39 - dev: true - - /postcss-reduce-transforms@4.0.2: - resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} - engines: {node: '>=6.9.0'} - dependencies: - cssnano-util-get-match: 4.0.0 - has: 1.0.3 - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - dev: true - - /postcss-selector-parser@3.1.2: - resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} - engines: {node: '>=8'} - dependencies: - dot-prop: 5.3.0 - indexes-of: 1.0.1 - uniq: 1.0.1 - dev: true - - /postcss-selector-parser@6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-svgo@4.0.3: - resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} - engines: {node: '>=6.9.0'} - dependencies: - postcss: 7.0.39 - postcss-value-parser: 3.3.1 - svgo: 1.3.2 - dev: true - - /postcss-unique-selectors@4.0.1: - resolution: {integrity: sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==} - engines: {node: '>=6.9.0'} - dependencies: - alphanum-sort: 1.0.2 - postcss: 7.0.39 - uniqs: 2.0.0 - dev: true - - /postcss-value-parser@3.3.1: - resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss@7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} - dependencies: - picocolors: 0.2.1 - source-map: 0.6.1 - dev: true - - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true - - /prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - dev: true - - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.2.0 - dev: true - - /prettier@2.3.2: - resolution: {integrity: sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /pretty-error@2.1.2: - resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} - dependencies: - lodash: 4.17.21 - renderkid: 2.0.7 - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true - - /promise-inflight@1.0.1(bluebird@3.7.2): - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dependencies: - bluebird: 3.7.2 - dev: true - - /promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - requiresBuild: true - dependencies: - asap: 2.0.6 - dev: true - optional: true - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: true - - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: true - - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - dependencies: - bn.js: 4.12.0 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - parse-asn1: 5.1.6 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: true - - /punycode@1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - dev: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true - - /qrcodejs2@0.0.2: - resolution: {integrity: sha512-+Y4HA+cb6qUzdgvI3KML8GYpMFwB24dFwzMkS/yXq6hwtUGNUnZQdUnksrV1XGMc2mid5ROw5SAuY9XhI3ValA==} - dev: false - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - dev: true - - /qs@6.9.4: - resolution: {integrity: sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==} - engines: {node: '>=0.6'} - dev: false - - /query-string@4.3.4: - resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} - engines: {node: '>=0.10.0'} - dependencies: - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - dev: true - - /querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - dev: true - - /querystring@0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - - /raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - dependencies: - performance-now: 2.1.0 - dev: false - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raphael@2.3.0: - resolution: {integrity: sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ==} - dependencies: - eve-raphael: 0.5.0 - dev: false - - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@2.2.1(supports-color@6.1.0): - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10(supports-color@6.1.0) - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - optional: true - - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - dev: true - - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true - - /regenerator-runtime@0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: false - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true - - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} - dependencies: - '@babel/runtime': 7.21.0 - dev: true - - /regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - dev: true - - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - - /regexpp@2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - dev: true - - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: true - - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: true - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: true - - /renderkid@2.0.7: - resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 3.0.1 - dev: true - - /repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: true - - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: true - - /request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign2: 0.7.0 - aws4: 1.12.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false - - /resolve-cwd@2.0.0: - resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} - engines: {node: '>=4'} - dependencies: - resolve-from: 3.0.0 - dev: true - - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: true - - /resolve@1.22.3: - resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==} - hasBin: true - dependencies: - is-core-module: 2.12.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /restore-cursor@2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - dev: true - - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true - - /rgb-regex@1.0.1: - resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} - dev: true - - /rgba-regex@1.0.0: - resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} - dev: true - - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - dev: true - - /robust-predicates@3.0.1: - resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} - dev: false - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - - /run-queue@1.0.3: - resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} - dependencies: - aproba: 1.2.0 - dev: true - - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false - - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-regex: 1.1.4 - dev: true - - /safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - dependencies: - ret: 0.1.15 - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: true - - /schema-utils@1.0.0: - resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} - engines: {node: '>= 4'} - dependencies: - ajv: 6.12.6 - ajv-errors: 1.0.1(ajv@6.12.6) - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true - - /select@1.1.2: - resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} - dev: false - - /selfsigned@1.10.14: - resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} - dependencies: - node-forge: 0.10.0 - dev: true - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - - /send@0.18.0(supports-color@6.1.0): - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9(supports-color@6.1.0) - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} - dependencies: - randombytes: 2.1.0 - dev: true - - /serve-index@1.9.1(supports-color@6.1.0): - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9(supports-color@6.1.0) - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /serve-static@1.15.0(supports-color@6.1.0): - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0(supports-color@6.1.0) - transitivePeerDependencies: - - supports-color - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true - - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /shallow-equal@1.2.1: - resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} - dev: false - - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /shelljs@0.3.0: - resolution: {integrity: sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==} - engines: {node: '>=0.8.0'} - hasBin: true - dev: false - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: true - - /slash@1.0.0: - resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} - engines: {node: '>=0.10.0'} - dev: true - - /slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - dev: true - - /slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - dev: true - - /snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - dev: true - - /snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /snapdragon@0.8.2(supports-color@6.1.0): - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - dependencies: - base: 0.11.2 - debug: 2.6.9(supports-color@6.1.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /sockjs-client@1.6.1(supports-color@6.1.0): - resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} - engines: {node: '>=12'} - dependencies: - debug: 3.2.7(supports-color@6.1.0) - eventsource: 2.0.2 - faye-websocket: 0.11.4 - inherits: 2.0.4 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: true - - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - dev: true - - /sort-keys@1.1.2: - resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-obj: 1.1.0 - dev: true - - /sortablejs@1.10.2: - resolution: {integrity: sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==} - dev: false - - /source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - dev: true - - /source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: true - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /spark-md5@3.0.2: - resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} - dev: false - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - dev: true - - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true - - /spdy-transport@3.0.0(supports-color@6.1.0): - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - dependencies: - debug: 4.3.4(supports-color@6.1.0) - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - dev: true - - /spdy@4.0.2(supports-color@6.1.0): - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - dependencies: - debug: 4.3.4(supports-color@6.1.0) - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0(supports-color@6.1.0) - transitivePeerDependencies: - - supports-color - dev: true - - /split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - - /ssri@6.0.2: - resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} - dependencies: - figgy-pudding: 3.5.2 - dev: true - - /ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - dev: true - - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: true - - /static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - dev: true - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - - /stream-browserify@2.0.2: - resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /stream-each@1.2.3: - resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} - dependencies: - end-of-stream: 1.4.4 - stream-shift: 1.0.1 - dev: true - - /stream-http@2.8.3: - resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 2.3.8 - to-arraybuffer: 1.0.1 - xtend: 4.0.2 - dev: true - - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} - dev: true - - /strict-uri-encode@1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} - dev: true - - /string-convert@0.2.1: - resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} - dev: false - - /string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-indent@2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} - dev: true - - /strip-json-comments@1.0.4: - resolution: {integrity: sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==} - engines: {node: '>=0.8.0'} - hasBin: true - dev: false - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /stylehacks@4.0.3: - resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} - engines: {node: '>=6.9.0'} - dependencies: - browserslist: 4.21.5 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 - dev: true - - /stylis@4.1.3: - resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - - /supports-color@6.1.0: - resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} - engines: {node: '>=6'} - dependencies: - has-flag: 3.0.0 - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: true - - /svgo@1.3.2: - resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} - engines: {node: '>=4.0.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true - dependencies: - chalk: 2.4.2 - coa: 2.0.2 - css-select: 2.1.0 - css-select-base-adapter: 0.1.1 - css-tree: 1.0.0-alpha.37 - csso: 4.2.0 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - object.values: 1.1.6 - sax: 1.2.4 - stable: 0.1.8 - unquote: 1.1.1 - util.promisify: 1.0.1 - dev: true - - /table@5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} - dependencies: - ajv: 6.12.6 - lodash: 4.17.21 - slice-ansi: 2.1.0 - string-width: 3.1.0 - dev: true - - /tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: true - - /terser-webpack-plugin@1.4.5(webpack@4.46.0): - resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.0.0 - dependencies: - cacache: 12.0.4 - find-cache-dir: 2.1.0 - is-wsl: 1.1.0 - schema-utils: 1.0.0 - serialize-javascript: 4.0.0 - source-map: 0.6.1 - terser: 4.8.1 - webpack: 4.46.0 - webpack-sources: 1.4.3 - worker-farm: 1.7.0 - dev: true - - /terser@4.8.1: - resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - acorn: 8.8.2 - commander: 2.20.3 - source-map: 0.6.1 - source-map-support: 0.5.21 - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - - /thread-loader@2.1.3(webpack@4.46.0): - resolution: {integrity: sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==} - engines: {node: '>= 6.9.0 <7.0.0 || >= 8.9.0'} - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - loader-runner: 2.4.0 - loader-utils: 1.4.2 - neo-async: 2.6.2 - webpack: 4.46.0 - dev: true - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true - - /timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - dependencies: - setimmediate: 1.0.5 - dev: true - - /timsort@0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: true - - /tiny-emitter@2.1.0: - resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} - dev: false - - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: false - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /to-arraybuffer@1.0.1: - resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - /to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - dev: true - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /toposort@1.0.7: - resolution: {integrity: sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==} - dev: true - - /tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - dev: true - - /tryer@1.0.1: - resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - dev: true - - /ts-pnp@1.2.0: - resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} - engines: {node: '>=6'} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.3.0: - resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} - dev: false - - /tty-browserify@0.0.0: - resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true - - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: true - - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true - - /uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - dev: false - - /uglify-js@3.4.10: - resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} - engines: {node: '>=0.8.0'} - hasBin: true - dependencies: - commander: 2.19.0 - source-map: 0.6.1 - dev: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true - - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: true - - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: true - - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: true - - /union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - dev: true - - /uniq@1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - dev: true - - /uniqs@2.0.0: - resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} - dev: true - - /unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - dependencies: - unique-slug: 2.0.2 - dev: true - - /unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - dependencies: - imurmurhash: 0.1.4 - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /unorm@1.6.0: - resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} - engines: {node: '>= 0.4.0'} - dev: false - - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - - /unquote@1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - dev: true - - /unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - dev: true - - /upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.5): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - - /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: true - - /url-loader@2.3.0(file-loader@4.3.0)(webpack@4.46.0): - resolution: {integrity: sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==} - engines: {node: '>= 8.9.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 - peerDependenciesMeta: - file-loader: - optional: true - dependencies: - file-loader: 4.3.0(webpack@4.46.0) - loader-utils: 1.4.2 - mime: 2.6.0 - schema-utils: 2.7.1 - webpack: 4.46.0 - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - - /url@0.11.0: - resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: true - - /use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - dev: true - - /uslug@1.0.4: - resolution: {integrity: sha512-Jrbpp/NS3TvIGNjfJT1sn3/BCeykoxR8GbNYW5lF6fUscLkbXFwj1b7m4DvIkHm8k3Qr6Co68lbTmoZTMGk/ow==} - engines: {node: '>= 0.4.0'} - dependencies: - unorm: 1.6.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /util.promisify@1.0.0: - resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} - dependencies: - define-properties: 1.2.0 - object.getownpropertydescriptors: 2.1.5 - dev: true - - /util.promisify@1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} - dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.5 - dev: true - - /util@0.10.3: - resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} - dependencies: - inherits: 2.0.1 - dev: true - - /util@0.11.1: - resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} - dependencies: - inherits: 2.0.3 - dev: true - - /utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: true - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - - /v8-compile-cache@2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /vendors@1.0.4: - resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} - dev: true - - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - - /vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - dev: true - - /vue-clipboard2@0.3.3: - resolution: {integrity: sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==} - dependencies: - clipboard: 2.0.11 - dev: false - - /vue-codemirror@4.0.6: - resolution: {integrity: sha512-ilU7Uf0mqBNSSV3KT7FNEeRIxH4s1fmpG4TfHlzvXn0QiQAbkXS9lLfwuZpaBVEnpP5CSE62iGJjoliTuA8poQ==} - engines: {node: '>= 4.0.0', npm: '>= 3.0.0'} - dependencies: - codemirror: 5.65.12 - diff-match-patch: 1.0.5 - dev: false - - /vue-eslint-parser@7.11.0(eslint@6.8.0): - resolution: {integrity: sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==} - engines: {node: '>=8.10'} - peerDependencies: - eslint: '>=5.0.0' - dependencies: - debug: 4.3.4(supports-color@6.1.0) - eslint: 6.8.0 - eslint-scope: 5.1.1 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.5.0 - lodash: 4.17.21 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /vue-hot-reload-api@2.3.4: - resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} - dev: true - - /vue-json-viewer@2.2.20(vue@2.6.14): - resolution: {integrity: sha512-Jrg/zLGR5c9cU7kweSkfkdozSCnb+j7T/50wA2jtgjJlX1DxOHm6gPB6u4yzhf7ZHssjFTenBdvhzxbCYre+Lw==} - peerDependencies: - vue: ^2.6.9 - dependencies: - clipboard: 2.0.11 - vue: 2.6.14 - dev: false - - /vue-loader@15.10.1(cache-loader@4.1.0)(css-loader@3.6.0)(vue-template-compiler@2.6.14)(webpack@4.46.0): - resolution: {integrity: sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==} - peerDependencies: - '@vue/compiler-sfc': ^3.0.8 - cache-loader: '*' - css-loader: '*' - vue-template-compiler: '*' - webpack: ^3.0.0 || ^4.1.0 || ^5.0.0-0 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - cache-loader: - optional: true - vue-template-compiler: - optional: true - dependencies: - '@vue/component-compiler-utils': 3.3.0 - cache-loader: 4.1.0(webpack@4.46.0) - css-loader: 3.6.0(webpack@4.46.0) - hash-sum: 1.0.2 - loader-utils: 1.4.2 - vue-hot-reload-api: 2.3.4 - vue-style-loader: 4.1.3 - vue-template-compiler: 2.6.14 - webpack: 4.46.0 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - dev: true - - /vue-loader@16.8.3(vue@2.6.14)(webpack@4.46.0): - resolution: {integrity: sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==} - requiresBuild: true - peerDependencies: - '@vue/compiler-sfc': ^3.0.8 - vue: ^3.2.13 - webpack: ^4.1.0 || ^5.0.0-0 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - vue: - optional: true - dependencies: - chalk: 4.1.2 - hash-sum: 2.0.0 - loader-utils: 2.0.4 - vue: 2.6.14 - webpack: 4.46.0 - dev: true - optional: true - - /vue-ref@2.0.0: - resolution: {integrity: sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ==} - dev: false - - /vue-router@3.5.2(vue@2.6.14): - resolution: {integrity: sha512-807gn82hTnjCYGrnF3eNmIw/dk7/GE4B5h69BlyCK9KHASwSloD1Sjcn06zg9fVG4fYH2DrsNBZkpLtb25WtaQ==} - peerDependencies: - vue: ^2 - dependencies: - vue: 2.6.14 - dev: false - - /vue-style-loader@4.1.3: - resolution: {integrity: sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==} - dependencies: - hash-sum: 1.0.2 - loader-utils: 1.4.2 - dev: true - - /vue-template-compiler@2.6.14: - resolution: {integrity: sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - /vue-template-es2015-compiler@1.9.1: - resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==} - dev: true - - /vue@2.6.14: - resolution: {integrity: sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==} - - /vuedraggable@2.24.3: - resolution: {integrity: sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==} - dependencies: - sortablejs: 1.10.2 - dev: false - - /vuex@3.5.1(vue@2.6.14): - resolution: {integrity: sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw==} - peerDependencies: - vue: ^2.0.0 - dependencies: - vue: 2.6.14 - dev: false - - /warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /watchpack-chokidar2@2.0.1: - resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} - requiresBuild: true - dependencies: - chokidar: 2.1.8(supports-color@6.1.0) - transitivePeerDependencies: - - supports-color - dev: true - optional: true - - /watchpack@1.7.5: - resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} - dependencies: - graceful-fs: 4.2.11 - neo-async: 2.6.2 - optionalDependencies: - chokidar: 3.5.3 - watchpack-chokidar2: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - dependencies: - minimalistic-assert: 1.0.1 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - dev: true - - /webpack-bundle-analyzer@3.9.0: - resolution: {integrity: sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==} - engines: {node: '>= 6.14.4'} - hasBin: true - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - bfj: 6.1.2 - chalk: 2.4.2 - commander: 2.20.3 - ejs: 2.7.4 - express: 4.18.2(supports-color@6.1.0) - filesize: 3.6.1 - gzip-size: 5.1.1 - lodash: 4.17.21 - mkdirp: 0.5.6 - opener: 1.5.2 - ws: 6.2.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /webpack-chain@6.5.1: - resolution: {integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==} - engines: {node: '>=8'} - dependencies: - deepmerge: 1.5.2 - javascript-stringify: 2.1.0 - dev: true - - /webpack-dev-middleware@3.7.3(webpack@4.46.0): - resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} - engines: {node: '>= 6'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - memory-fs: 0.4.1 - mime: 2.6.0 - mkdirp: 0.5.6 - range-parser: 1.2.1 - webpack: 4.46.0 - webpack-log: 2.0.0 - dev: true - - /webpack-dev-server@3.11.3(webpack@4.46.0): - resolution: {integrity: sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==} - engines: {node: '>= 6.11.5'} - hasBin: true - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - ansi-html-community: 0.0.8 - bonjour: 3.5.0 - chokidar: 2.1.8(supports-color@6.1.0) - compression: 1.7.4(supports-color@6.1.0) - connect-history-api-fallback: 1.6.0 - debug: 4.3.4(supports-color@6.1.0) - del: 4.1.1 - express: 4.18.2(supports-color@6.1.0) - html-entities: 1.4.0 - http-proxy-middleware: 0.19.1(debug@4.3.4)(supports-color@6.1.0) - import-local: 2.0.0 - internal-ip: 4.3.0 - ip: 1.1.8 - is-absolute-url: 3.0.3 - killable: 1.0.1 - loglevel: 1.8.1 - opn: 5.5.0 - p-retry: 3.0.1 - portfinder: 1.0.32(supports-color@6.1.0) - schema-utils: 1.0.0 - selfsigned: 1.10.14 - semver: 6.3.0 - serve-index: 1.9.1(supports-color@6.1.0) - sockjs: 0.3.24 - sockjs-client: 1.6.1(supports-color@6.1.0) - spdy: 4.0.2(supports-color@6.1.0) - strip-ansi: 3.0.1 - supports-color: 6.1.0 - url: 0.11.0 - webpack: 4.46.0 - webpack-dev-middleware: 3.7.3(webpack@4.46.0) - webpack-log: 2.0.0 - ws: 6.2.2 - yargs: 13.3.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /webpack-log@2.0.0: - resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} - engines: {node: '>= 6'} - dependencies: - ansi-colors: 3.2.4 - uuid: 3.4.0 - dev: true - - /webpack-merge@4.2.2: - resolution: {integrity: sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==} - dependencies: - lodash: 4.17.21 - dev: true - - /webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - dev: true - - /webpack@4.46.0: - resolution: {integrity: sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==} - engines: {node: '>=6.11.5'} - hasBin: true - peerDependencies: - webpack-cli: '*' - webpack-command: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webpack-command: - optional: true - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/wasm-edit': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - acorn: 6.4.2 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - chrome-trace-event: 1.0.3 - enhanced-resolve: 4.5.0 - eslint-scope: 4.0.3 - json-parse-better-errors: 1.0.2 - loader-runner: 2.4.0 - loader-utils: 1.4.2 - memory-fs: 0.4.1 - micromatch: 3.1.10(supports-color@6.1.0) - mkdirp: 0.5.6 - neo-async: 2.6.2 - node-libs-browser: 2.2.1 - schema-utils: 1.0.0 - tapable: 1.1.3 - terser-webpack-plugin: 1.4.5(webpack@4.46.0) - watchpack: 1.7.5 - webpack-sources: 1.4.3 - transitivePeerDependencies: - - supports-color - dev: true - - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: true - - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - dev: true - - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - - /worker-farm@1.7.0: - resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} - dependencies: - errno: 0.1.8 - dev: true - - /wrap-ansi@5.1.0: - resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - string-width: 3.1.0 - strip-ansi: 5.2.0 - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write@1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - dependencies: - mkdirp: 0.5.6 - dev: true - - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - - /xterm-addon-attach@0.6.0(xterm@4.13.0): - resolution: {integrity: sha512-Mo8r3HTjI/EZfczVCwRU6jh438B4WLXxdFO86OB7bx0jGhwh2GdF4ifx/rP+OB+Cb2vmLhhVIZ00/7x3YSP3dg==} - peerDependencies: - xterm: ^4.0.0 - dependencies: - xterm: 4.13.0 - dev: false - - /xterm-addon-fit@0.5.0(xterm@4.13.0): - resolution: {integrity: sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==} - peerDependencies: - xterm: ^4.0.0 - dependencies: - xterm: 4.13.0 - dev: false - - /xterm@4.13.0: - resolution: {integrity: sha512-HVW1gdoLOTnkMaqQCr2r3mQy4fX9iSa5gWxKZ2UTYdLa4iqavv7QxJ8n1Ypse32shPVkhTYPLS6vHEFZp5ghzw==} - dev: false - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@13.1.2: - resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs@13.3.2: - resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} - dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 13.1.2 - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yorkie@2.0.0: - resolution: {integrity: sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==} - engines: {node: '>=4'} - requiresBuild: true - dependencies: - execa: 0.8.0 - is-ci: 1.2.1 - normalize-path: 1.0.0 - strip-indent: 2.0.0 - dev: true - - /zrender@4.3.2: - resolution: {integrity: sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==} - dev: false - - /zrender@5.4.3: - resolution: {integrity: sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==} - dependencies: - tslib: 2.3.0 - dev: false diff --git a/web-vue/src/App.vue b/web-vue/src/App.vue index fed951e0f..3bcc3cc2f 100644 --- a/web-vue/src/App.vue +++ b/web-vue/src/App.vue @@ -54,21 +54,23 @@ export default { }, methods: { reload() { - this.routerActivation = false; - // 刷新菜单 - store - .dispatch("restLoadSystemMenus") - .then(() => { - // - }) - .catch(() => { - // 跳转到登录页面 - this.$router.push({ - path: "/login", + return new Promise(() => { + this.routerActivation = false; + // 刷新菜单 + store + .dispatch("restLoadSystemMenus") + .then(() => { + // + }) + .catch(() => { + // 跳转到登录页面 + this.$router.push({ + path: "/login", + }); }); + this.$nextTick(() => { + this.routerActivation = true; }); - this.$nextTick(() => { - this.routerActivation = true; }); }, }, diff --git a/web-vue/src/api/build-info.js b/web-vue/src/api/build-info.js index 75f7d0d38..5165462bf 100644 --- a/web-vue/src/api/build-info.js +++ b/web-vue/src/api/build-info.js @@ -93,6 +93,7 @@ export function editBuild(params) { autoBuildCron: params.autoBuildCron, buildMode: params.buildMode, aliasCode: params.aliasCode, + resultKeepDay: params.resultKeepDay, }; return axios({ url: "/build/edit", diff --git a/web-vue/src/api/dispatch.js b/web-vue/src/api/dispatch.js index c0a33ce81..4d52e3924 100644 --- a/web-vue/src/api/dispatch.js +++ b/web-vue/src/api/dispatch.js @@ -193,10 +193,11 @@ export function getDishPatchLogList(params) { } // 获取分发白名单数据 -export function getDispatchWhiteList() { +export function getDispatchWhiteList(params) { return axios({ url: "/outgiving/white-list", method: "post", + data: params, }); } @@ -212,6 +213,18 @@ export function editDispatchWhiteList(params) { }); } +/** + * 编辑分发白名单 + * @param {*} params + */ +export function editDispatchWhiteList2(params) { + return axios({ + url: "/outgiving/whitelist-directory-submit2", + method: "post", + data: params, + }); +} + /** * 取消分发 * @param {*} id 分发 ID diff --git a/web-vue/src/api/docker-api.js b/web-vue/src/api/docker-api.js index 80ef93455..07b1ee182 100644 --- a/web-vue/src/api/docker-api.js +++ b/web-vue/src/api/docker-api.js @@ -327,3 +327,18 @@ export function syncToWorkspace(params) { params: params, }); } + +/** + * 容器 重建容器 + * @param {JSON} params + */ +export function dockerContainerRebuildContainer(urlPrefix, params) { + return axios({ + url: urlPrefix + "/container/rebuild-container", + method: "post", + headers: { + "Content-Type": "application/json", + }, + data: params, + }); +} diff --git a/web-vue/src/api/node.js b/web-vue/src/api/node.js index d41908bb6..6b5bdad35 100644 --- a/web-vue/src/api/node.js +++ b/web-vue/src/api/node.js @@ -5,7 +5,7 @@ export function getNodeList(params) { return axios({ url: "/node/list_data.json", method: "post", - params: params, + data: params, }); } @@ -57,7 +57,7 @@ export function getNodeProjectList(params) { return axios({ url: "/node/node_project_list", method: "post", - params: params, + data: params, }); } @@ -66,7 +66,7 @@ export function getProjectList(params) { return axios({ url: "/node/project_list", method: "post", - params: params, + data: params, }); } diff --git a/web-vue/src/api/repository.js b/web-vue/src/api/repository.js index 7337a0b1c..1a5beb6c7 100644 --- a/web-vue/src/api/repository.js +++ b/web-vue/src/api/repository.js @@ -1,4 +1,4 @@ -import axios, {loadRouterBase} from "./config"; +import axios, { loadRouterBase } from "./config"; /** * 分页获取仓库列表 @@ -63,6 +63,19 @@ export function getRepositoryInfo(params) { }); } +/** + * 获取仓库信息 + * + * @return {axios} 请求结果 axios 对象 + */ +export function listRepositoryGroup(params) { + return axios({ + url: "/build/repository/list-group", + method: "get", + params, + }); +} + /** * 编辑仓库信息,新增或者更新 * diff --git a/web-vue/src/api/ssh-file.js b/web-vue/src/api/ssh-file.js index b3b78aa83..bb2c34401 100644 --- a/web-vue/src/api/ssh-file.js +++ b/web-vue/src/api/ssh-file.js @@ -117,3 +117,88 @@ export function renameFileFolder(baseUrl, params) { data: params, }); } + +/** + * 修改文件权限 + * @param {*} baseUrl + * @param { + * String id, + * String allowPathParent, + * String nextPath, + * String fileName, + * String permissionValue + * } params + * @returns + */ +export function changeFilePermission(baseUrl, params) { + return axios({ + url: baseUrl + "change_file_permission.json", + method: "post", + data: params, + }); +} + +/** + * 权限字符串转权限对象 + * @param {String} str "lrwxr-xr-x" + * @returns + */ +export function parsePermissions(str) { + let permissions = {owner: {}, group: {}, others: {}}; + + let chars = str.split(''); + permissions.owner.read = (chars[1] === "r"); + permissions.owner.write = (chars[2] === "w"); + permissions.owner.execute = (chars[3] === "x"); + + permissions.group.read = (chars[4] === "r"); + permissions.group.write = (chars[5] === "w"); + permissions.group.execute = (chars[6] === "x"); + + permissions.others.read = (chars[7] === "r"); + permissions.others.write = (chars[8] === "w"); + permissions.others.execute = (chars[9] === "x"); + + return permissions; +} + +/** + * 文件权限字符串转权限值 + * @param { + * owner: { read: false, write: false, execute: false, }, + * group: { read: false, write: false, execute: false, }, + * others: { read: false, write: false, execute: false, }, + * } permissions + * @returns + */ +export function calcFilePermissionValue(permissions) { + let value = 0; + if (permissions.owner.read) { + value += 400; + } + if (permissions.owner.write) { + value += 200; + } + if (permissions.owner.execute) { + value += 100; + } + if (permissions.group.read) { + value += 40; + } + if (permissions.group.write) { + value += 20; + } + if (permissions.group.execute) { + value += 10; + } + if (permissions.others.read) { + value += 4; + } + if (permissions.others.write) { + value += 2; + } + if (permissions.others.execute) { + value += 1; + } + return value; +} diff --git a/web-vue/src/api/system/assets-docker.js b/web-vue/src/api/system/assets-docker.js index 4db87bce1..0da428c5e 100644 --- a/web-vue/src/api/system/assets-docker.js +++ b/web-vue/src/api/system/assets-docker.js @@ -60,6 +60,14 @@ export function deleteDcoker(params) { }); } +export function dockerListGroup(params) { + return axios({ + url: "/system/assets/docker/list-group", + method: "get", + params: params, + }); +} + export function initDockerSwarm(data) { return axios({ url: "/system/assets/docker/init", @@ -114,7 +122,7 @@ export function machineDockerDistribute(params) { return axios({ url: "/system/assets/docker/distribute", method: "post", - params: params, + data: params, }); } diff --git a/web-vue/src/api/system/assets-machine.js b/web-vue/src/api/system/assets-machine.js index 6cbf3bd45..08d841c4a 100644 --- a/web-vue/src/api/system/assets-machine.js +++ b/web-vue/src/api/system/assets-machine.js @@ -5,7 +5,7 @@ export function machineListData(params) { return axios({ url: "/system/assets/machine/list-data", method: "post", - params: params, + data: params, }); } @@ -22,7 +22,7 @@ export function machineEdit(params) { return axios({ url: "/system/assets/machine/edit", method: "post", - params: params, + data: params, }); } @@ -31,7 +31,7 @@ export function machineDelete(params) { return axios({ url: "/system/assets/machine/delete", method: "post", - params: params, + data: params, }); } @@ -40,7 +40,7 @@ export function machineDistribute(params) { return axios({ url: "/system/assets/machine/distribute", method: "post", - params: params, + data: params, }); } diff --git a/web-vue/src/api/system/assets-ssh.js b/web-vue/src/api/system/assets-ssh.js index 28477eb16..a4115fd16 100644 --- a/web-vue/src/api/system/assets-ssh.js +++ b/web-vue/src/api/system/assets-ssh.js @@ -6,7 +6,7 @@ export function machineSshListData(params) { return axios({ url: "/system/assets/ssh/list-data", method: "post", - params: params, + data: params, }); } @@ -23,7 +23,7 @@ export function machineSshEdit(params) { return axios({ url: "/system/assets/ssh/edit", method: "post", - params: params, + data: params, }); } @@ -32,7 +32,7 @@ export function machineSshDelete(params) { return axios({ url: "/system/assets/ssh/delete", method: "post", - params: params, + data: params, }); } @@ -41,7 +41,7 @@ export function machineSshDistribute(params) { return axios({ url: "/system/assets/ssh/distribute", method: "post", - params: params, + data: params, }); } @@ -67,7 +67,7 @@ export function machineSshSaveWorkspaceConfig(params) { return axios({ url: "/system/assets/ssh/save-workspace-config", method: "post", - params: params, + data: params, }); } diff --git a/web-vue/src/api/system/cluster.js b/web-vue/src/api/system/cluster.js new file mode 100644 index 000000000..cc1b3e0ce --- /dev/null +++ b/web-vue/src/api/system/cluster.js @@ -0,0 +1,56 @@ +import axios from "@/api/config"; + +/* + * 集群列表 + * @param {*} + * } params + */ +export function getClusterList(params) { + return axios({ + url: "/cluster/list", + method: "post", + data: params, + }); +} + +/* + * 删除集群 + * @param {String} id + * } params + */ +export function deleteCluster(id) { + return axios({ + url: "/cluster/delete", + method: "get", + params: { id: id }, + }); +} + +/* + * 删除所有可用分组 + * @param {} * + * } params + */ +export function listLinkGroups(params) { + return axios({ + url: "/cluster/list-link-groups", + method: "get", + params: params, + }); +} + +export function listClusterAll(params) { + return axios({ + url: "/cluster/list-all", + method: "get", + params: params, + }); +} + +export function editCluster(params) { + return axios({ + url: "/cluster/edit", + method: "post", + data: params, + }); +} diff --git a/web-vue/src/api/user/user.js b/web-vue/src/api/user/user.js index 7e5bc93b6..79e226a63 100644 --- a/web-vue/src/api/user/user.js +++ b/web-vue/src/api/user/user.js @@ -243,6 +243,19 @@ export function myWorkspace() { }); } +/** + * 我的集群 + * + * @returns + */ +export function clusterList() { + return axios({ + url: "/user/cluster-list", + method: "get", + params: {}, + }); +} + /** * 保存我的工作空间 * diff --git a/web-vue/src/api/workspace.js b/web-vue/src/api/workspace.js index 7ab83d19c..f72690733 100644 --- a/web-vue/src/api/workspace.js +++ b/web-vue/src/api/workspace.js @@ -64,6 +64,19 @@ export function deleteWorkspace(id) { }); } +/* + * 删除工作空间检查 + * @param {String} id + * } params + */ +export function preDeleteWorkspace(id) { + return axios({ + url: "/system/workspace/pre-check-delete", + method: "get", + params: { id: id }, + }); +} + /* * 工作空间环境变量列表 * @param {*} @@ -76,6 +89,18 @@ export function getWorkspaceEnvList(params) { data: params, }); } +/* + * 工作空间环境变量全部列表 + * @param {*} + * } params + */ +export function getWorkspaceEnvAll(data) { + return axios({ + url: "/system/workspace_env/all", + method: "post", + data, + }); +} /** * diff --git a/web-vue/src/assets/reset.less b/web-vue/src/assets/reset.less index 6a0913dbc..2d8cbb774 100644 --- a/web-vue/src/assets/reset.less +++ b/web-vue/src/assets/reset.less @@ -1,7 +1,8 @@ /* 全局样式,重置样式 */ html, body { - width: 100vw; + // 宽度 100vw 会出现横向滚动条 + // width: 100vw; height: 100vh; margin: 0; padding: 0; diff --git a/web-vue/src/components/customInput/index.vue b/web-vue/src/components/customInput/index.vue new file mode 100644 index 000000000..1857d3c95 --- /dev/null +++ b/web-vue/src/components/customInput/index.vue @@ -0,0 +1,86 @@ + + + diff --git a/web-vue/src/components/logView/view-pre.vue b/web-vue/src/components/logView/view-pre.vue index bd39f9d8e..3b0d055e5 100644 --- a/web-vue/src/components/logView/view-pre.vue +++ b/web-vue/src/components/logView/view-pre.vue @@ -136,15 +136,24 @@ export default { }, methods: { scrollToBottom() { + const element = document.querySelector(`#${this.uniqueId}`); + if (element) { + this.scrollTo(element.scrollHeight - element.clientHeight); + } + }, + scrollToTop() { + this.scrollTo(0); + }, + scrollTo(h) { const element = document.querySelector(`#${this.uniqueId}`); if (element) { // console.log(element, element.scrollHeight); - element.scrollTop = element.scrollHeight - element.clientHeight; + element.scrollTop = h; // this.scrollTo(element, element.scrollHeight - element.clientHeight, 500); // element.scrollIntoView(false); } }, - scrollTo(element, position) { + scrollTo2(element, position) { if (!window.requestAnimationFrame) { window.requestAnimationFrame = function (cb) { return setTimeout(cb, 10); @@ -203,12 +212,13 @@ export default { }) .map((item) => { return { - text: Prism.highlight(item.text, Prism.languages.log, "log"), + // 制表符号 替换 + text: Prism.highlight(item.text, Prism.languages.log, "log").replace(/\t/g, "    "), id: item.id, }; }); this.dataArray = [...this.dataArray, ...tempArray]; - // console.log(this.dataArray); + // console.log(this.dataArray.length, this.showList.length); if (this.config.logScroll) { setTimeout(() => { // 延迟触发滚动 @@ -221,6 +231,7 @@ export default { clearLogCache() { this.dataArray = []; + this.scrollToTop(); }, }, }; diff --git a/web-vue/src/pages/build/edit.vue b/web-vue/src/pages/build/edit.vue index d8fd43e31..9c96ec4b5 100644 --- a/web-vue/src/pages/build/edit.vue +++ b/web-vue/src/pages/build/edit.vue @@ -661,6 +661,7 @@

  • 附加环境变量是指读取仓库指定环境变量文件来添加到执行构建运行时
  • 比如常见的 .env 文件
  • 文件内容格式要求:env_name=xxxxx 不满足格式的行将自动忽略
  • +
  • 也支持 URL 参数格式:test_par=123abc&test_par2=abc21
  • @@ -680,7 +681,7 @@ - + 发布隐藏文件 @@ -691,6 +692,33 @@ + + + + + 保留天数 + + + + + + + + + + + 保留个数 + + + + + + @@ -1069,7 +1097,7 @@ export default { }, // 添加 handleAdd() { - this.temp = {}; + this.temp = { resultKeepDay: 0 }; this.branchList = []; // this.tempRepository = {}; // this.loadRepositoryList(); @@ -1082,6 +1110,7 @@ export default { this.tempExtraData = { cacheBuild: true, saveBuildFile: true, + resultKeepCount: 0, }; this.$refs["editBuildForm"]?.resetFields(); }, @@ -1101,6 +1130,9 @@ export default { if (this.tempExtraData.saveBuildFile === undefined) { this.tempExtraData.saveBuildFile = true; } + if (this.tempExtraData.resultKeepCount === undefined) { + this.tempExtraData.resultKeepCount = 0; + } // 设置发布方式的数据 if (this.tempExtraData.releaseMethodDataId) { diff --git a/web-vue/src/pages/certificate/list.vue b/web-vue/src/pages/certificate/list.vue index 6d6d75cc4..d37c9f3fe 100644 --- a/web-vue/src/pages/certificate/list.vue +++ b/web-vue/src/pages/certificate/list.vue @@ -112,11 +112,7 @@ title="部署证书" width="50%" :maskClosable="false" - @ok=" - () => { - this.$refs.releaseFile?.tryCommit(); - } - " + @ok="releaseFileOk()" > @@ -338,6 +334,10 @@ export default { } }); }, + + releaseFileOk() { + this.$refs.releaseFile?.tryCommit(); + } }, }; diff --git a/web-vue/src/pages/dispatch/white-list.vue b/web-vue/src/pages/dispatch/white-list.vue index 31ce11f81..14154a0d3 100644 --- a/web-vue/src/pages/dispatch/white-list.vue +++ b/web-vue/src/pages/dispatch/white-list.vue @@ -19,8 +19,14 @@ diff --git a/web-vue/src/pages/docker/container.vue b/web-vue/src/pages/docker/container.vue index a73fe96f5..3fe07a69e 100644 --- a/web-vue/src/pages/docker/container.vue +++ b/web-vue/src/pages/docker/container.vue @@ -162,9 +162,14 @@ - + + 重建 + + + + 编辑 - + @@ -379,9 +384,14 @@ - + + 重建 + + + + 编辑 - + @@ -437,6 +447,39 @@ > + + + + diff --git a/web-vue/src/pages/docker/images.vue b/web-vue/src/pages/docker/images.vue index 94cd9a50a..9ff925268 100644 --- a/web-vue/src/pages/docker/images.vue +++ b/web-vue/src/pages/docker/images.vue @@ -3,6 +3,7 @@ diff --git a/web-vue/src/pages/docker/prune.vue b/web-vue/src/pages/docker/prune.vue index 71b2eb028..a1caca5b6 100644 --- a/web-vue/src/pages/docker/prune.vue +++ b/web-vue/src/pages/docker/prune.vue @@ -97,7 +97,7 @@ export default { }, }, mounted() { - this.loadData(); + // this.loadData(); // console.log(Comparator); }, methods: { diff --git a/web-vue/src/pages/docker/swarm/service.vue b/web-vue/src/pages/docker/swarm/service.vue index d73707e81..6f62874fe 100644 --- a/web-vue/src/pages/docker/swarm/service.vue +++ b/web-vue/src/pages/docker/swarm/service.vue @@ -310,6 +310,7 @@ + @@ -337,7 +338,8 @@ - + + diff --git a/web-vue/src/pages/file-manager/fileStorage/list.vue b/web-vue/src/pages/file-manager/fileStorage/list.vue index 4e941fd19..11469746b 100644 --- a/web-vue/src/pages/file-manager/fileStorage/list.vue +++ b/web-vue/src/pages/file-manager/fileStorage/list.vue @@ -293,11 +293,7 @@ title="发布文件" width="50%" :maskClosable="false" - @ok=" - () => { - this.$refs.releaseFile?.tryCommit(); - } - " + @ok="releaseFileOk()" > @@ -669,6 +665,10 @@ export default { } }); }, + + releaseFileOk() { + this.$refs.releaseFile?.tryCommit(); + } }, }; diff --git a/web-vue/src/pages/layout/content-tab.vue b/web-vue/src/pages/layout/content-tab.vue index eb176c3ad..9de0780f7 100644 --- a/web-vue/src/pages/layout/content-tab.vue +++ b/web-vue/src/pages/layout/content-tab.vue @@ -1,5 +1,5 @@ diff --git a/web-vue/src/pages/repository/repository-list.vue b/web-vue/src/pages/repository/repository-list.vue new file mode 100644 index 000000000..9fcc0e513 --- /dev/null +++ b/web-vue/src/pages/repository/repository-list.vue @@ -0,0 +1,776 @@ + + + diff --git a/web-vue/src/pages/ssh/ssh-file.vue b/web-vue/src/pages/ssh/ssh-file.vue index 7a67382a0..a70f57cf8 100644 --- a/web-vue/src/pages/ssh/ssh-file.vue +++ b/web-vue/src/pages/ssh/ssh-file.vue @@ -4,7 +4,44 @@ - 刷新 + + 刷新 + + + {{ item.name }} + + + + {{ + sortMethodList.find((item) => { + return item.key === sortMethod.key; + }) && + sortMethodList.find((item) => { + return item.key === sortMethod.key; + }).name + }}排序 + + + + + @@ -79,7 +116,9 @@ 编辑 - + + 权限 + 下载 删除 @@ -126,14 +165,85 @@ + + + + + 权限 + 所属用户 + 用户组 + 其他 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 执行 + + + + + + + + + + + + + 确认修改 + + + diff --git a/web-vue/src/pages/system/taskStat.vue b/web-vue/src/pages/system/taskStat.vue index d2bb819fd..6888e0267 100644 --- a/web-vue/src/pages/system/taskStat.vue +++ b/web-vue/src/pages/system/taskStat.vue @@ -12,7 +12,7 @@ - {{ text }} + {{ text }} diff --git a/web-vue/src/pages/system/workspace-env.vue b/web-vue/src/pages/system/workspace-env.vue index 78fc939ba..3cc05de91 100644 --- a/web-vue/src/pages/system/workspace-env.vue +++ b/web-vue/src/pages/system/workspace-env.vue @@ -18,6 +18,14 @@ 搜索 新增 + + + + diff --git a/web-vue/src/pages/system/workspace-list.vue b/web-vue/src/pages/system/workspace-list.vue new file mode 100644 index 000000000..963264f1c --- /dev/null +++ b/web-vue/src/pages/system/workspace-list.vue @@ -0,0 +1,463 @@ + + + diff --git a/web-vue/src/pages/system/workspace.vue b/web-vue/src/pages/system/workspace.vue index 117e08e3a..b5fa4aa12 100644 --- a/web-vue/src/pages/system/workspace.vue +++ b/web-vue/src/pages/system/workspace.vue @@ -1,314 +1,25 @@ diff --git a/web-vue/src/utils/const.js b/web-vue/src/utils/const.js index 77a301931..7437660fb 100644 --- a/web-vue/src/utils/const.js +++ b/web-vue/src/utils/const.js @@ -454,18 +454,23 @@ export function itemGroupBy(arr, groupKey, key, dataKey) { * @returns */ export function formatDuration(ms, seg, levelCount) { - if (isNaN(Number(ms))) { + let msNum = Number(ms); + if (isNaN(msNum)) { return ms; } + if (msNum === 0) { + return "-"; + } + seg = seg || ""; levelCount = levelCount || 5; - if (ms < 0) ms = -ms; + if (msNum < 0) msNum = -msNum; const time = { - 天: Math.floor(ms / 86400000), - 小时: Math.floor(ms / 3600000) % 24, - 分钟: Math.floor(ms / 60000) % 60, - 秒: Math.floor(ms / 1000) % 60, - 毫秒: Math.floor(ms) % 1000, + 天: Math.floor(msNum / 86400000), + 小时: Math.floor(msNum / 3600000) % 24, + 分钟: Math.floor(msNum / 60000) % 60, + 秒: Math.floor(msNum / 1000) % 60, + 毫秒: Math.floor(msNum) % 1000, }; return Object.entries(time) .filter((val) => val[1] !== 0) diff --git a/web-vue3/src/App.vue b/web-vue3/src/App.vue index 1e563ed1c..dad537548 100644 --- a/web-vue3/src/App.vue +++ b/web-vue3/src/App.vue @@ -20,7 +20,7 @@ const scrollbarFlag = computed(() => { return guideStore.scrollbarFlag ?? true }) -onMounted(() => {}) +onMounted(() => { }) const reload = () => { routerActivation.value = false @@ -71,6 +71,10 @@ provide('reload', reload) .ant-spin-text { text-shadow: 0 0 black !important; } + +.search-wrapper { + margin-bottom: 20px; +} diff --git a/web-vue3/src/pages/node/list.vue b/web-vue3/src/pages/node/list.vue index a89afc5b8..2b11b0286 100644 --- a/web-vue3/src/pages/node/list.vue +++ b/web-vue3/src/pages/node/list.vue @@ -34,11 +34,10 @@ 搜索 - 快速安装 + 快速安装 + :pagination="pagination" @change="(pagination, filters, sorter) => { + listQuery.value = CHANGE_PAGE(listQuery.value, { pagination, sorter }) + loadData() + } + " :row-selection="rowSelection"> @@ -375,11 +367,10 @@ - + @@ -409,14 +400,13 @@ - - + + { } const fastInstallNodeShow = () => { - fastInstallNode.value = true + showFastInstall.value = true } // export default { diff --git a/web-vue3/src/pages/system/workspace-env.vue b/web-vue3/src/pages/system/workspace-env.vue index 6c469bef0..5fa4655d9 100644 --- a/web-vue3/src/pages/system/workspace-env.vue +++ b/web-vue3/src/pages/system/workspace-env.vue @@ -1,122 +1,88 @@