From e6f82cdf5a88ce709cfb53adaf3971dd1b8aadc0 Mon Sep 17 00:00:00 2001 From: bennett Date: Sat, 24 Aug 2024 16:30:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E4=BE=9D=E8=B5=96=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=88=90=E5=8A=9F=20fix:=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dws=20server=E4=B8=8D=E6=94=AF=E6=8C=81=20443=20?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=20fix:=20=E4=BF=AE=E5=A4=8D=20docker=20?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E5=90=AF=E5=8A=A8=E5=8F=AF=E8=83=BD=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=E6=9D=83=E9=99=90=E7=AD=89=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20feat:=20=E5=AE=B9=E5=99=A8=E5=86=85=E5=A2=9E=E5=8A=A0=20emoj?= =?UTF-8?q?i=20=E5=AD=97=E4=BD=93=20feat:=20=E5=A2=9E=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E6=9E=84=E5=BB=BA=E9=A1=B9=E7=9B=AE=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=95=9C=E5=83=8F=20style:=20=E4=BF=AE=E6=94=B9=20mar?= =?UTF-8?q?kdown=20=E4=B8=AD=20yaml=20=E4=BB=A3=E7=A0=81=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=96=B9=E5=BC=8F=20chore:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BE=9D=E8=B5=96=E8=AE=A9=E4=BB=85=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E7=94=9F=E4=BA=A7=E7=8E=AF=E5=A2=83=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8F=AF=E6=AD=A3=E5=B8=B8=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bennett --- .editorconfig | 1 + .github/workflows/docker-image.yml | 51 +++++ Dockerfile | 51 +++-- Dockerfile.base | 83 +++++++++ docker-entrypoint.sh | 8 +- package.json | 25 +-- pnpm-lock.yaml | 195 +++++++++----------- src/modules/lib/core/base-client/default.ts | 7 +- src/plugins/@management/upgrade-plugins.ts | 47 ++--- src/plugins/@management/upgrade.ts | 41 ++-- src/utils/async.ts | 9 + src/utils/system.ts | 22 +++ src/utils/url.ts | 9 + 13 files changed, 362 insertions(+), 187 deletions(-) create mode 100644 .github/workflows/docker-image.yml create mode 100644 Dockerfile.base create mode 100644 src/utils/system.ts diff --git a/.editorconfig b/.editorconfig index 62e930a4..c7ca7e32 100644 --- a/.editorconfig +++ b/.editorconfig @@ -560,6 +560,7 @@ ij_markdown_max_lines_between_paragraphs = 1 ij_markdown_min_lines_around_block_elements = 1 ij_markdown_min_lines_around_header = 1 ij_markdown_min_lines_between_paragraphs = 1 +ij_yaml_indent_size = 2 [{*.yaml,*.yml}] indent_size = 2 diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 00000000..bb57b292 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,51 @@ +name: Docker Image CI + +on: + push: + branches: + - 'main' + - 'dev' + tags: + - 'v*' + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + # list of Docker images to use as base name for tags + images: | + ghcr.io/${{ github.repository }} + # generate Docker tags based on the following events/attributes + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile.base + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + USE_MIRROR=false + platforms: linux/amd64,linux/arm64 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index f18f58b9..483a360f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,37 @@ -FROM alpine +FROM alpine:3.20 AS resource + +ARG USE_MIRROR=true + +RUN set -eux; \ + emoji_url="https://github.com/samuelngs/apple-emoji-linux/releases/latest/download/AppleColorEmoji.ttf"; \ + if $USE_MIRROR; then \ + sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories; \ + emoji_url="https://mirror.ghproxy.com/${emoji_url}"; \ + fi; \ + apk add --no-cache --update ca-certificates; \ + update-ca-certificates; \ + emoji_dir="/usr/share/fonts/emoji"; \ + mkdir -p "${emoji_dir}"; \ + wget "${emoji_url}" -O "${emoji_dir}/AppleColorEmoji.ttf" + +FROM node:18-alpine3.20 as adachi-base + +ARG USE_MIRROR=true ENV TZ=Asia/Shanghai \ PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ - GOSU_VERSION=1.16 + GOSU_VERSION=1.17 \ + CI=1 +COPY --from=resource /usr/share/fonts/emoji/AppleColorEmoji.ttf /usr/share/fonts/emoji/AppleColorEmoji.ttf COPY public/fonts/wqy-microhei-regular.ttf /usr/share/fonts/win/wqy-microhei-regular.ttf # Installs latest Chromium (100) package. -# Non-mainland China servers can remove this sed replace and npm config registry. example: RUN apk add --no-cache ... RUN set -eux; \ - sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories; \ + if $USE_MIRROR; then \ + sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories; \ + fi; \ apk add --no-cache --update \ chromium \ nss \ @@ -18,8 +39,6 @@ RUN set -eux; \ harfbuzz \ ca-certificates \ git \ - nodejs \ - npm \ tzdata \ dos2unix \ dumb-init; \ @@ -30,7 +49,6 @@ RUN set -eux; \ pnpm config set registry https://registry.npmmirror.com; \ pnpm config set store-dir ~/.pnpm-store; \ rm -rf /var/cache/apk/*; \ - addgroup -S -g 1000 adachi && adduser -S -G adachi -u 999 adachi; \ \ apk add --no-cache --update --virtual .gosu-deps \ ca-certificates \ @@ -40,8 +58,14 @@ RUN set -eux; \ \ update-ca-certificates; \ dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ - wget -O /usr/local/bin/gosu "https://mirror.ghproxy.com/https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \ - wget -O /usr/local/bin/gosu.asc "https://mirror.ghproxy.com/https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \ + gosu_exe="https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \ + gosu_asc="https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \ + if $USE_MIRROR; then \ + gosu_exe="https://mirror.ghproxy.com/${gosu_exe}"; \ + gosu_asc="https://mirror.ghproxy.com/${gosu_asc}"; \ + fi; \ + wget -O /usr/local/bin/gosu "${gosu_exe}"; \ + wget -O /usr/local/bin/gosu.asc "${gosu_asc}"; \ \ # verify the signature export GNUPGHOME="$(mktemp -d)"; \ @@ -58,11 +82,16 @@ RUN set -eux; \ gosu --version; \ gosu nobody true +FROM adachi-base + COPY . /bot WORKDIR /bot -RUN chmod +x docker-entrypoint.sh && dos2unix docker-entrypoint.sh +RUN chmod +x docker-entrypoint.sh && \ + dos2unix docker-entrypoint.sh && \ + addgroup -S -g 1001 adachi && \ + adduser -S -G adachi -u 1001 adachi ENTRYPOINT ["sh", "docker-entrypoint.sh"] -CMD sh -c "pnpm install && pnpm docker-start" \ No newline at end of file +CMD sh -c "pnpm docker-start" \ No newline at end of file diff --git a/Dockerfile.base b/Dockerfile.base new file mode 100644 index 00000000..f5f16694 --- /dev/null +++ b/Dockerfile.base @@ -0,0 +1,83 @@ +FROM alpine:3.20 AS resource + +ARG USE_MIRROR=true + +RUN set -eux; \ + emoji_url="https://github.com/samuelngs/apple-emoji-linux/releases/latest/download/AppleColorEmoji.ttf"; \ + if $USE_MIRROR; then \ + sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories; \ + emoji_url="https://mirror.ghproxy.com/${emoji_url}"; \ + fi; \ + apk add --no-cache --update ca-certificates; \ + update-ca-certificates; \ + emoji_dir="/usr/share/fonts/emoji"; \ + mkdir -p "${emoji_dir}"; \ + wget "${emoji_url}" -O "${emoji_dir}/AppleColorEmoji.ttf" + +FROM node:18-alpine3.20 + +ARG USE_MIRROR=true + +ENV TZ=Asia/Shanghai \ + PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ + GOSU_VERSION=1.17 \ + CI=1 + +COPY --from=resource /usr/share/fonts/emoji/AppleColorEmoji.ttf /usr/share/fonts/emoji/AppleColorEmoji.ttf +COPY public/fonts/wqy-microhei-regular.ttf /usr/share/fonts/win/wqy-microhei-regular.ttf + +# Installs base package. +RUN set -eux; \ + if $USE_MIRROR; then \ + sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories; \ + fi; \ + apk add --no-cache --update \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + git \ + tzdata \ + dos2unix \ + dumb-init; \ + cp /usr/share/zoneinfo/$TZ /etc/localtime; \ + echo $TZ > /etc/timezone; \ + npm config set registry https://registry.npmmirror.com; \ + npm i pnpm -g; \ + pnpm config set registry https://registry.npmmirror.com; \ + pnpm config set store-dir ~/.pnpm-store; \ + rm -rf /var/cache/apk/*; \ + \ + apk add --no-cache --update --virtual .gosu-deps \ + ca-certificates \ + dpkg \ + gnupg \ + ; \ + \ + update-ca-certificates; \ + dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ + gosu_exe="https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \ + gosu_asc="https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \ + if $USE_MIRROR; then \ + gosu_exe="https://mirror.ghproxy.com/${gosu_exe}"; \ + gosu_asc="https://mirror.ghproxy.com/${gosu_asc}"; \ + fi; \ + wget -O /usr/local/bin/gosu "${gosu_exe}"; \ + wget -O /usr/local/bin/gosu.asc "${gosu_asc}"; \ + \ + # verify the signature + export GNUPGHOME="$(mktemp -d)"; \ + gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \ + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \ + command -v gpgconf && gpgconf --kill all || :; \ + rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \ + \ + # clean up fetch dependencies + apk del --no-network .gosu-deps; \ + \ + chmod +x /usr/local/bin/gosu; \ + # verify that the binary works + gosu --version; \ + gosu nobody true \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 894d298b..8e1f8d3f 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,8 +1,10 @@ #!/bin/sh set -e -# 设置文件所属的用户和用户组(排除数据库使用的database目录) -#find . -type d \( -path ./database -o -path ./qsign -o \) -prune -o -print | xargs chown adachi:adachi -find . \! -user adachi -exec chown adachi '{}' + + +# 切换用户前执行依赖安装操作,处理 pnpm 创建文件夹权限不够的问题 +pnpm i -P --no-frozen-lockfile + +find . \! -user adachi -exec test -e '{}' \; -exec chown adachi '{}' + # 使用 gosu 切换到 adachi 用户启动 dumb-init exec gosu adachi dumb-init -- "$@" \ No newline at end of file diff --git a/package.json b/package.json index 8a72c843..128be98c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "adachi-bot", "private": true, - "version": "3.3.2", + "version" : "3.4.0", "description": "功能集成的 bot 开发框架", "scripts": { "dev": "cross-env NODE_ENV=development ts-node app.ts", @@ -13,7 +13,6 @@ "log": "pm2 logs --lines 100 adachi-bot" }, "dependencies": { - "@types/ws": "^8.5.5", "axios": "^1.3.6", "express": "^4.18.2", "express-jwt": "^8.4.1", @@ -34,9 +33,16 @@ "systeminformation": "^5.17.12", "tencentcloud-sdk-nodejs-nlp": "^4.0.590", "ws": "^8.13.0", - "yaml": "^2.2.2" + "yaml" : "^2.2.2", + "typescript" : "^5.0.4", + "compressing" : "^1.10.0", + "tsconfig-paths" : "^4.2.0", + "ts-node" : "^10.9.1", + "single-line-log" : "^1.1.2", + "vite" : "^4.4.5" }, "devDependencies": { + "@types/ws" : "^8.5.5", "@types/express": "^4.17.17", "@types/express-ws": "^3.0.1", "@types/lodash": "^4.14.194", @@ -45,17 +51,14 @@ "@types/node-schedule": "^2.1.0", "@types/nodemailer": "^6.4.10", "@types/single-line-log": "^1.1.0", - "compressing": "^1.10.0", "cross-env": "^7.0.3", "nodemon": "^2.0.22", - "single-line-log": "^1.1.2", - "ts-node": "^10.9.1", - "ts-node-dev": "^2.0.0", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.0.4", - "vite": "^4.4.5" + "ts-node-dev" : "^2.0.0" }, "workspaces": [ "src/plugins/**" - ] + ], + "engines" : { + "node" : ">=16" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c0f115d..d63bf483 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,12 @@ importers: .: dependencies: - '@types/ws': - specifier: ^8.5.5 - version: 8.5.5 axios: specifier: ^1.3.6 version: 1.3.6 + compressing: + specifier: ^1.10.0 + version: 1.10.0 express: specifier: ^4.18.2 version: 4.18.2 @@ -62,12 +62,27 @@ importers: request: specifier: ^2.88.2 version: 2.88.2 + single-line-log: + specifier: ^1.1.2 + version: 1.1.2 systeminformation: specifier: ^5.17.12 version: 5.17.12 tencentcloud-sdk-nodejs-nlp: specifier: ^4.0.590 version: 4.0.590 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@18.16.1)(typescript@5.0.4) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.0.4 + version: 5.0.4 + vite: + specifier: ^4.4.5 + version: 4.4.5(@types/node@18.16.1) ws: specifier: ^8.13.0 version: 8.13.0 @@ -99,39 +114,18 @@ importers: '@types/single-line-log': specifier: ^1.1.0 version: 1.1.0 - compressing: - specifier: ^1.10.0 - version: 1.10.0 + '@types/ws': + specifier: ^8.5.5 + version: 8.5.5 cross-env: specifier: ^7.0.3 version: 7.0.3 nodemon: specifier: ^2.0.22 version: 2.0.22 - single-line-log: - specifier: ^1.1.2 - version: 1.1.2 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@18.16.1)(typescript@5.0.4) ts-node-dev: specifier: ^2.0.0 version: 2.0.0(@types/node@18.16.1)(typescript@5.0.4) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.0.4 - version: 5.0.4 - vite: - specifier: ^4.4.5 - version: 4.4.5(@types/node@18.16.1) - - src/plugins/genshin: - dependencies: - chokidar: - specifier: ^3.5.3 - version: 3.5.3 packages: @@ -161,14 +155,13 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true /@eggjs/yauzl@2.11.0: resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} dependencies: buffer-crc32: 0.2.13 fd-slicer2: 1.2.0 - dev: true + dev: false /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} @@ -176,7 +169,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/android-arm@0.18.20: @@ -185,7 +178,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/android-x64@0.18.20: @@ -194,7 +187,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/darwin-arm64@0.18.20: @@ -203,7 +196,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/darwin-x64@0.18.20: @@ -212,7 +205,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/freebsd-arm64@0.18.20: @@ -221,7 +214,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/freebsd-x64@0.18.20: @@ -230,7 +223,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-arm64@0.18.20: @@ -239,7 +232,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-arm@0.18.20: @@ -248,7 +241,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-ia32@0.18.20: @@ -257,7 +250,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-loong64@0.18.20: @@ -266,7 +259,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-mips64el@0.18.20: @@ -275,7 +268,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-ppc64@0.18.20: @@ -284,7 +277,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-riscv64@0.18.20: @@ -293,7 +286,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-s390x@0.18.20: @@ -302,7 +295,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/linux-x64@0.18.20: @@ -311,7 +304,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/netbsd-x64@0.18.20: @@ -320,7 +313,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/openbsd-x64@0.18.20: @@ -329,7 +322,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/sunos-x64@0.18.20: @@ -338,7 +331,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/win32-arm64@0.18.20: @@ -347,7 +340,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/win32-ia32@0.18.20: @@ -356,7 +349,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@esbuild/win32-x64@0.18.20: @@ -365,24 +358,21 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /@opencensus/core@0.0.8: resolution: {integrity: sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==} @@ -556,19 +546,15 @@ packages: /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - dev: true /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -687,6 +673,7 @@ packages: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 18.16.1 + dev: true /@types/yauzl@2.10.0: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} @@ -753,7 +740,7 @@ packages: /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} - dev: true + dev: false /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -783,7 +770,6 @@ packages: /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -886,7 +872,7 @@ packages: dependencies: readable-stream: 2.3.8 safe-buffer: 5.2.1 - dev: true + dev: false /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -940,17 +926,18 @@ packages: /buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: true + dev: false /buffer-alloc@1.2.0: resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 - dev: true + dev: false /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: false /buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -958,7 +945,7 @@ packages: /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: true + dev: false /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1063,7 +1050,7 @@ packages: /code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} - dev: true + dev: false /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1109,7 +1096,7 @@ packages: streamifier: 0.1.1 tar-stream: 1.6.2 yazl: 2.5.1 - dev: true + dev: false /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1148,6 +1135,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false /cosmiconfig@8.1.3: resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} @@ -1161,7 +1149,6 @@ packages: /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true /cron-parser@4.8.1: resolution: {integrity: sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==} @@ -1297,7 +1284,6 @@ packages: /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dev: true /dynamic-dedupe@0.3.0: resolution: {integrity: sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==} @@ -1341,6 +1327,7 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + dev: false /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} @@ -1383,7 +1370,7 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: true + dev: false /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -1562,7 +1549,7 @@ packages: resolution: {integrity: sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==} dependencies: pend: 1.2.0 - dev: true + dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -1602,7 +1589,7 @@ packages: /flushwritable@1.0.0: resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} - dev: true + dev: false /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} @@ -1658,6 +1645,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} @@ -1709,7 +1697,7 @@ packages: /get-ready@1.0.0: resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==} - dev: true + dev: false /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} @@ -1766,6 +1754,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1865,7 +1854,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true + dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1885,6 +1874,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -1933,7 +1923,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: number-is-nan: 1.0.1 - dev: true + dev: false /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -1965,7 +1955,7 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + dev: false /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2019,7 +2009,7 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: true + dev: false /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -2125,7 +2115,6 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true /md5-typescript@1.0.5: resolution: {integrity: sha512-ovAc4EtiNt2dY8JPhPr/wkC9h4U5k/nuClNVcG0Ga3V1rMlYpAY24ZaaymFXJlz+ccJ6UMPo3FSaVKe7czBsXw==} @@ -2168,7 +2157,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /mitt@3.0.0: resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} @@ -2183,7 +2171,7 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - dev: true + dev: false /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} @@ -2217,7 +2205,7 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true + dev: false /needle@2.4.0: resolution: {integrity: sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==} @@ -2306,7 +2294,7 @@ packages: /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} - dev: true + dev: false /oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -2422,6 +2410,7 @@ packages: /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -2429,7 +2418,7 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + dev: false /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2548,7 +2537,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true + dev: false /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} @@ -2557,7 +2546,7 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + dev: false /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -2611,6 +2600,7 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + dev: false /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} @@ -2726,7 +2716,7 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true + dev: false /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -2816,6 +2806,7 @@ packages: /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -2827,7 +2818,7 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true + dev: false /run-series@1.1.9: resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} @@ -2835,13 +2826,15 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + dev: false /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -2951,7 +2944,7 @@ packages: resolution: {integrity: sha512-awzaaIPtYFdexLr6TBpcZSGPB6D1RInNO/qNetgaJloPDF/D0GkVtLvGEp8InfmLV7CyLyQ5fIRP+tVN/JmWQA==} dependencies: string-width: 1.0.2 - dev: true + dev: false /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} @@ -2984,7 +2977,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: true + dev: false /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -3028,7 +3021,7 @@ packages: /streamifier@0.1.1: resolution: {integrity: sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==} engines: {node: '>=0.10'} - dev: true + dev: false /streamroller@3.1.5: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} @@ -3048,7 +3041,7 @@ packages: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: true + dev: false /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -3067,7 +3060,7 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: true + dev: false /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3080,7 +3073,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 - dev: true + dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -3092,7 +3085,6 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -3143,7 +3135,7 @@ packages: readable-stream: 2.3.8 to-buffer: 1.1.1 xtend: 4.0.2 - dev: true + dev: false /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -3187,7 +3179,7 @@ packages: /to-buffer@1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: true + dev: false /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -3281,7 +3273,6 @@ packages: typescript: 5.0.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true /tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} @@ -3290,7 +3281,7 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true + dev: false /tsconfig@7.0.0: resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} @@ -3384,6 +3375,7 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} @@ -3398,7 +3390,6 @@ packages: /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -3448,7 +3439,7 @@ packages: rollup: 3.27.0 optionalDependencies: fsevents: 2.3.2 - dev: true + dev: false /vizion@2.2.1: resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} @@ -3552,7 +3543,6 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: true /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -3609,12 +3599,11 @@ packages: resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} dependencies: buffer-crc32: 0.2.13 - dev: true + dev: false /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} diff --git a/src/modules/lib/core/base-client/default.ts b/src/modules/lib/core/base-client/default.ts index 38591e8b..7c451b44 100644 --- a/src/modules/lib/core/base-client/default.ts +++ b/src/modules/lib/core/base-client/default.ts @@ -2,6 +2,7 @@ import BaseClient from "./base"; import WsMessage from "@/utils/message"; import WebSocket from "ws"; import { ActionRequest } from "@/modules/lib"; +import { parseURL } from "@/utils/url"; export default class DefaultClient extends BaseClient { private static __instance: DefaultClient; @@ -67,7 +68,11 @@ export default class DefaultClient extends BaseClient { } public async connect(): Promise { - this.wsEvent.connect( `ws://${ this.eventTarget }` ); + let wsProtocol = "ws:"; + if ( parseURL( this.eventTarget ).port === "443" ) { + wsProtocol = "wss:"; + } + this.wsEvent.connect( `${ wsProtocol }//${ this.eventTarget }` ); /* 监听连接成功状态 */ return new Promise( resolve => { // 事件服务器连接状态 diff --git a/src/plugins/@management/upgrade-plugins.ts b/src/plugins/@management/upgrade-plugins.ts index 91bc8b06..4dc4ceef 100644 --- a/src/plugins/@management/upgrade-plugins.ts +++ b/src/plugins/@management/upgrade-plugins.ts @@ -1,19 +1,11 @@ import fetch, { Response } from "node-fetch"; -import { exec } from "child_process"; import { defineDirective, InputParameter } from "@/modules/command"; import PluginManager, { PluginInfo } from "@/modules/plugin"; import RenderServer from "@/modules/server"; import { isEqualObject } from "@/utils/object"; +import { execCommand } from "@/utils/system"; +import { waitWithTimeout } from "@/utils/async"; -/* 超时检查 */ -function waitWithTimeout( promise: Promise, timeout: number ): Promise { - let timer; - const timeoutPromise = new Promise( ( _, reject ) => { - timer = setTimeout( () => reject( `timeout: ${ timeout }ms` ), timeout ); - } ); - return Promise.race( [ timeoutPromise, promise ] ) - .finally( () => clearTimeout( timer ) ); -} /* 检查更新 */ async function getCommitsInfo( repo: string ): Promise { @@ -25,25 +17,12 @@ async function getCommitsInfo( repo: string ): Promise { return [ json ]; } -/* 命令执行 */ -async function execHandle( command: string, cwd?: string ): Promise { - return new Promise( ( resolve, reject ) => { - exec( command, { cwd }, ( error, stdout, _stderr ) => { - if ( error ) { - reject( error ); - } else { - resolve( stdout ); - } - } ) - } ) -} - /* 更新 plugin */ async function updateBotPlugin( i: InputParameter, pluginInfo: PluginInfo, isForce: boolean = false ): Promise { const { logger, file } = i; const command = !isForce ? "git pull --no-rebase" : "git reset --hard && git pull --no-rebase"; const cwd = file.getFilePath( pluginInfo.key, "plugin" ); - const execPromise = execHandle( command, cwd ).then( ( stdout: string ) => { + const execPromise = execCommand( command, { cwd } ).then( ( stdout: string ) => { logger.info( stdout ); if ( /(Already up[ -]to[ -]date|已经是最新的)/.test( stdout ) ) { throw `[${ pluginInfo.name }]当前已经是最新版本了`; @@ -62,16 +41,24 @@ async function updateBotPlugin( i: InputParameter, pluginInfo: PluginInfo, isFor } } -async function installDependencies( { logger, sendMessage }: InputParameter ): Promise { +async function installDependencies( i: InputParameter, pluginInfo?: PluginInfo ): Promise { + const { logger, sendMessage, file } = i; try { - const command = "pnpm install"; - const execPromise = execHandle( command ).then( ( stdout: string ) => { + const command = "pnpm i -P --no-frozen-lockfile"; + const cwd = pluginInfo ? file.getFilePath( pluginInfo.key, "plugin" ) : undefined; + const execPromise = execCommand( command, { + env: { + ...process.env, + "CI": "1" + }, + cwd + } ).then( ( stdout: string ) => { logger.info( stdout ); } ); - await waitWithTimeout( execPromise, 30000 ); + await waitWithTimeout( execPromise, 60000 ); } catch ( error ) { if ( typeof error === "string" ) { - const errMsg = error.includes( "timeout" ) ? "更新失败,网络请求超时" : error; + const errMsg = error.includes( "timeout" ) ? "更新成功,依赖安装超时" : error; await sendMessage( errMsg ); } else { await sendMessage( "依赖安装失败,请前往控制台查看错误信息。" ); @@ -175,7 +162,7 @@ export default defineDirective( "order", async ( i ) => { try { await updateBotPlugin( i, pluginInfo, isForce ); // 安装/更新依赖 - await installDependencies( i ); + await installDependencies( i, pluginInfo ); await i.sendMessage( `[${ pluginName }]插件更新完成,${ isRestart ? "正在重载插件..." : "请稍后手动重载插件" }` ); if ( checkResult.newDate ) { await i.redis.setString( dbKey, checkResult.newDate ); diff --git a/src/plugins/@management/upgrade.ts b/src/plugins/@management/upgrade.ts index a618b1ea..3c8f3c81 100644 --- a/src/plugins/@management/upgrade.ts +++ b/src/plugins/@management/upgrade.ts @@ -1,17 +1,10 @@ import fetch, { Response } from "node-fetch"; -import { exec } from "child_process"; import pm2 from "pm2"; import { defineDirective, InputParameter } from "@/modules/command"; +import { execCommand } from "@/utils/system"; +import { waitWithTimeout } from "@/utils/async"; +import process from "process"; -/* 超时检查 */ -function waitWithTimeout( promise: Promise, timeout: number ): Promise { - let timer; - const timeoutPromise = new Promise( ( _, reject ) => { - timer = setTimeout( () => reject( `timeout: ${ timeout }ms` ), timeout ); - } ); - return Promise.race( [ timeoutPromise, promise ] ) - .finally( () => clearTimeout( timer ) ); -} /* 检查更新 */ async function getCommitsInfo(): Promise { @@ -19,25 +12,12 @@ async function getCommitsInfo(): Promise { return await result.json(); } -/* 命令执行 */ -async function execHandle( command: string ): Promise { - return new Promise( ( resolve, reject ) => { - exec( command, ( error, stdout, _stderr ) => { - if ( error ) { - reject( error ); - } else { - resolve( stdout ); - } - } ) - } ) -} - /* 更新 bot */ async function updateBot( { matchResult, sendMessage, logger }: InputParameter<"order"> ): Promise { const isForce = !!matchResult.match[0]; let command = !isForce ? "git checkout HEAD package*.json && git pull --no-rebase" : "git reset --hard && git pull --no-rebase"; - let execPromise = execHandle( command ).then( ( stdout: string ) => { + let execPromise = execCommand( command ).then( ( stdout: string ) => { logger.info( stdout ); if ( /(Already up[ -]to[ -]date|已经是最新的)/.test( stdout ) ) { throw "当前已经是最新版本了"; @@ -58,14 +38,19 @@ async function updateBot( { matchResult, sendMessage, logger }: InputParameter<" } try { - command = "pnpm install"; - execPromise = execHandle( command ).then( ( stdout: string ) => { + command = "pnpm i -P --no-frozen-lockfile"; + execPromise = execCommand( command, { + env: { + ...process.env, + "CI": "1" + } + } ).then( ( stdout: string ) => { logger.info( stdout ); } ); - await waitWithTimeout( execPromise, 30000 ); + await waitWithTimeout( execPromise, 60000 ); } catch ( error ) { if ( typeof error === "string" ) { - const errMsg = error.includes( "timeout" ) ? "更新失败,网络请求超时" : error; + const errMsg = error.includes( "timeout" ) ? "更新成功,依赖安装超时" : error; await sendMessage( errMsg ); } else { await sendMessage( "依赖安装失败,请前往控制台查看错误信息。" ); diff --git a/src/utils/async.ts b/src/utils/async.ts index e1ffe175..46bf66dc 100644 --- a/src/utils/async.ts +++ b/src/utils/async.ts @@ -8,4 +8,13 @@ export function sleep( time: number ): Promise { return new Promise( resolve => { setTimeout( resolve, time ); } ); +} + +export function waitWithTimeout( promise: Promise, timeout: number ): Promise { + let timer: string | number | NodeJS.Timeout | undefined; + const timeoutPromise = new Promise( ( _, reject ) => { + timer = setTimeout( () => reject( `timeout: ${ timeout }ms` ), timeout ); + } ); + return Promise.race( [ timeoutPromise, promise ] ) + .finally( () => clearTimeout( timer ) ); } \ No newline at end of file diff --git a/src/utils/system.ts b/src/utils/system.ts new file mode 100644 index 00000000..3d2a3781 --- /dev/null +++ b/src/utils/system.ts @@ -0,0 +1,22 @@ +import { exec } from "child_process"; + + +type ExecOptions = { + env?: NodeJS.ProcessEnv + timeout?: number; + cwd?: string; +} + +export async function execCommand( command: string, options?: ExecOptions ): Promise { + return new Promise( ( resolve, reject ) => { + exec( command, { + ...options + }, ( error, stdout, _stderr ) => { + if ( error ) { + reject( error ); + } else { + resolve( stdout ); + } + } ); + } ) +} \ No newline at end of file diff --git a/src/utils/url.ts b/src/utils/url.ts index 0557ce9c..cec95661 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -28,4 +28,13 @@ export function urlParamsParse( url: string | undefined, params: Record